AngularJS plusieurs modèle de sélection de la liaison de données

Je suis en utilisant AngularJS v1.2.0-rc.3.

J'ai un modèle de y avec une relation 1 à plusieurs avec le modèle x.

Au début, j'avais un formulaire pour le modèle y avec un choix multiple pour xs, quelque chose comme ceci:

Contrôleur:

function test($scope) {
  $scope.xs = [
    {id:1, value:'value 1'},
    {id:2, value:'value 2'},
    {id:3, value:'value 3'}
  ];
  $scope.y = {xs:[2]};
}

Vue:

<div ng-controller="test">
  <select multiple ng-model="y.xs" ng-options="x.id as x.value for x in xs">
  </select>    
</div>

Le résultat est un tableau des éléments sélectionnés.

http://plnkr.co/edit/s3tvvHeyE17TVH5KNkPZ

Très bien, mais j'avais besoin de passer à une liste de case à cocher et constaté que je ne pouvais pas utiliser un tableau plus.

J'ai essayé d'utiliser la répétition de l'index, comme ceci:

<div ng-repeat="x in xs">
  <input type="checkbox" ng-model="y.xs[$index]" ng-true-value="{{x.id}}"/>
  {{x.value}}
</div>

mais de pré-sélectionner le 2ème élément par exemple, j'avais besoin d'utiliser cette:

$scope.y = {xs: [null, '2']};

qui était inutile.

http://plnkr.co/edit/9UfbKF2gFLnhTOKu3Yep

Après un peu de recherche, il semble que la méthode recommandée est d'utiliser un objet de hachage, comme

<div ng-repeat="x in xs">
  <input type="checkbox" ng-model="y.xs[x.id]"/>
  {{x.value}}
</div>

http://plnkr.co/edit/Xek8alEJbwq3g0NAPMcF

mais si les éléments sont sélectionnés, vous vous retrouvez avec quelque chose qui ressemble à ceci:

y={
  "xs": {
    "1": false,
    "2": false,
    "3": false
  }
}

j'ai donc fini par l'ajout d'une montre expression de filtrer les fausses valeurs, comme ceci:

$scope.$watch('y.xs', function(n) {
  for (var k in n) 
    if (n.hasOwnProperty(k) && !n[k]) 
      delete n[k];
}, true);

http://plnkr.co/edit/S1C1g5fYKzUZb7b0pRtp

Cela fonctionne, mais il se sent pas satisfaisante.

Que c'est un usage commun cas, je suis curieux de savoir comment les autres se résoudre.

Mise à jour

Suite à la suggestion d'utiliser un custom directive, j'ai trouvé cette solution qui maintient le tout sous forme d'une liste.

Directive:

angular.module('checkbox', [])
.directive('checkboxList', function () {
return {
restrict: 'A',
replace: true,
scope: {
selection: '=',
items: '=',
value: '@',
label: '@'
},
template: '<div ng-repeat="item in list">' +
'<label>' +
'<input type="checkbox" value="{{item.value}}" ng-checked="item.checked" ng-click="toggle($index)"/>' +
'{{item.label}}' +
'</label>' +
'</div>',
controller: ['$scope', function ($scope) {
$scope.toggle = function (index) {
var item = $scope.list[index],
i = $scope.selection.indexOf(item.value);
item.checked = !item.checked;
if (!item.checked && i > -1) {
$scope.selection.splice(i, 1);
} else if (item.checked && i < 0) {
$scope.selection.push(item.value);
}
};
$scope.$watch('items', function (value) {
$scope.list = [];
if (angular.isArray(value)) {
angular.forEach(value, function (item) {
$scope.list.push({
value: item[$scope.value],
label: item[$scope.label],
checked: $scope.selection.indexOf(item[$scope.value]) > -1
});
});
}
}, true);
}]
};
});

Vue:

<div checkbox-list
selection="a.bs"
items="bs"
value="id"
label="name">
</div>

http://plnkr.co/edit/m7yH9bMPuRCg5OP2u0VX

Votre AngularJS exemple, en montrant comment le lier à une "sélection multiple" pour un tableau JSON, vient de m'a sauvé beaucoup de temps - grâce !

OriginalL'auteur gwhn | 2013-11-08