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
OriginalL'auteur gwhn | 2013-11-08
Vous devez vous connecter pour publier un commentaire.
J'ai dû écrire un multi sélectionnez la directive moi-même dans le passé, n'hésitez pas à le saisir à http://isteven.github.io/angular-multi-select.
Comme pour la liaison de données approche, ma structure de données est en fait assez similaire à la vôtre, mais dans mon approche, j'ai ajouté un de plus la propriété, qui représentent la case de l'état.
Exemple, avec votre contribution ci-dessus, j'ai ajouté "checked":
Et je le passe à la directive comme ceci:
Lorsque vous cochez /décochez une case à cocher, la directive permettra de modifier le modèle d'entrée de $champ d'application.xs.vérifié en conséquence. Pour ce faire, j'attacher un gestionnaire de clic sur chaque case. Ce gestionnaire va appeler une fonction dans laquelle je passe la case objet en tant que paramètre de la fonction. Cette fonction sera alors de synchroniser la case à cocher état et le modèle.
Pour obtenir choisis /a coché des cases à cocher, vous aurez seulement besoin de boucle
$scope.xs
plus où.checked === true
Exemple:
Pardon pour mon mauvais anglais, et espérons que cette aide. Des acclamations.
OriginalL'auteur user3587521
Je suis allé la directive approche. Il me laisse avec une liste de codes pour les objets qui sont vérifiés. C'est un violon pour elle JSFIDDLE.
C'est ce que mon code html ressemble.
Et mon directive
OriginalL'auteur Zack Argyle
J'avais besoin d'une case à cocher solution qui permettrait d'afficher aussi les valeurs qui n'étaient pas dans la liste des choix possibles (si la liste a changé depuis que l'utilisateur a rempli le formulaire?).
Aussi, je ne pense pas qu'une fonction de veille a été nécessaire.
Enfin, j'ai dû passer dans la forme donc je pourrais le mettre au sale si l'utilisateur a activé les cases.
Mise en garde: Dans mon cas, j'ai seulement besoin d'un tableau de chaînes de caractères, comme mon modèle, ce qui n'est pas exactement ce que l'affiche a été à l'aide de son modèle.
HTML:
Directive:
OriginalL'auteur Scrappy Doo