AngularJS y ng-checked

publicado por: Anonymous

a ver si pueden decirme porque sucede esto.
La cosa es que tengo un doble ng-repeat donde se recorren dos listas. La primera lista es una lista de contratistas y dentro de esta lista hay otra lista de documentos. Es decir, los contratistas tienen una lista de documentos asociados a ellos.

Para recorrer las dos listas dentro del HTML tengo el siguiente codigo:

          <accordion close-others="true" ng-repeat="contratista in listaContratistas track by $index | filter:{activo:'S'}">
                <accordion-group heading="{{contratista.razonSocial}}">
                    <button ng-click="delContratista($index);" class="btn btn-block btn-danger btn-xs">Eliminar Contratista</button>
                    <p>Documentos obligatorios:</p>
                    <div ng-repeat="documento in contratista.documentosProyecto track by $index">
                        <div class="checkbox" ng-click="$parent.delDocumentoContratista($parent.$index, $index);" >
                        <!--<div class="checkbox" ng-click="$documento.obligatorio == 'S'? documento.obligatorio = 'N' : documento.obligatorio = 'S'" >-->
                            <label>
                                <input type="checkbox" ng-checked="listaContratistas[$parent.$index].documentosProyecto[$index].obligatorio == 'S'">
                                <!--<input type="checkbox" ng-checked="documento.obligatorio == 'S'">-->
                                {{documento.tipo}}
                            </label>
                        </div>
                    </div>
                </accordion-group>
        </accordion>

Los documentos que tienen los contratistas tienen una propiedad llamada obligatorio, la cual por defecto es igual a ‘S’.

El problema es, que cuando se hace click en un check de cualquier contratista, se desmarca su check y el de todos los contratistas. El codigo en el controlador es el siguiente:

$scope.delDocumentoContratista = function(indexContratista, indexDocument){
            if($scope.listaContratistas[indexContratista].documentosProyecto[indexDocument].obligatorio == 'S'){
                $scope.listaContratistas[indexContratista].documentosProyecto[indexDocument].obligatorio = 'N';
            }else{
                $scope.listaContratistas[indexContratista].documentosProyecto[indexDocument].obligatorio = 'S';
            }
        }

He probado ya infinidad de cosas y sigue sin funcionar. Que tengo mal en el codigo para que me suceda esto?

Un saludo y muchas gracias.

solución

Tu tienes los datos contratista.documentosProyecto me imagino que estos datos tienen una id o algun campo que los diferencia de los demas. Debes hacer lo siguiente :

En tu controlador crea un arreglo vació, por ejemplo

$scope.contratistaModel = [];

Luego recorre tus datos

angular.forEach($scope.contratista.documentosProyecto, function(documento,index){
      $scope.contratistaModel[documento.id] = false;
})

Con esto conseguiras crear un arreglo, con los indices correspondientes a cada documento.id, se inicializa en false porque es un checkbox SI ES QUE FUERA EL CASO y dependiera de un valor si el checkbox aparece marcado o desmarcado, debes hacer tu esa validación, por ejemplo :

angular.forEach($scope.contratista.documentosProyecto, function(documento,index){
      if(documento..obligatorio == 'S'){
          $scope.contratistaModel[documento.id] = false;
      }else{
          $scope.contratistaModel[documento.id] = true;
      }
})

Luego en tu vista simplemente :

<input type="checkbox" ng-model="contratistaModel[documento.id]" ng-checked="listaContratistas(documento)">

Aqui ya no envias el valor que tenga, si no el objeto del ng-repeat completo y llamas a la funcion listaContratistas(documento), en esta funcion deberias hacer esto :

$scope.listaContratistas = function(documento){  
    if($scope.contratistaModel[documento.id]){

    }else{

    }
}

Aqui evaluas si tu modelo UNICO $scope.contratistaModel[documento.id] esta checkeado o no, si dan check en el ya sabes que hacer.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *