Il existe deux façons d'aborder ce problème. Soit utiliser un tableau simple, soit un tableau d'objets. Chaque solution a ses avantages et ses inconvénients. Vous trouverez ci-dessous une solution pour chaque cas.
Avec un simple tableau comme données d'entrée
Le HTML pourrait ressembler à cela :
<label ng-repeat="fruitName in fruits">
<input
type="checkbox"
name="selectedFruits[]"
value="{{fruitName}}"
ng-checked="selection.indexOf(fruitName) > -1"
ng-click="toggleSelection(fruitName)"
> {{fruitName}}
</label>
Et le code de contrôleur approprié serait :
app.controller('SimpleArrayCtrl', ['$scope', function SimpleArrayCtrl($scope) {
// Fruits
$scope.fruits = ['apple', 'orange', 'pear', 'naartjie'];
// Selected fruits
$scope.selection = ['apple', 'pear'];
// Toggle selection for a given fruit by name
$scope.toggleSelection = function toggleSelection(fruitName) {
var idx = $scope.selection.indexOf(fruitName);
// Is currently selected
if (idx > -1) {
$scope.selection.splice(idx, 1);
}
// Is newly selected
else {
$scope.selection.push(fruitName);
}
};
}]);
Pour : Structure de données simple et le basculement par nom est facile à gérer.
Cons : L'ajout/suppression est fastidieux car il faut gérer deux listes (l'entrée et la sélection)
Avec un tableau d'objets comme données d'entrée
Le HTML pourrait ressembler à cela :
<label ng-repeat="fruit in fruits">
<!--
- Use `value="{{fruit.name}}"` to give the input a real value, in case the form gets submitted
traditionally
- Use `ng-checked="fruit.selected"` to have the checkbox checked based on some angular expression
(no two-way-data-binding)
- Use `ng-model="fruit.selected"` to utilize two-way-data-binding. Note that `.selected`
is arbitrary. The property name could be anything and will be created on the object if not present.
-->
<input
type="checkbox"
name="selectedFruits[]"
value="{{fruit.name}}"
ng-model="fruit.selected"
> {{fruit.name}}
</label>
Et le code de contrôleur approprié serait :
app.controller('ObjectArrayCtrl', ['$scope', 'filterFilter', function ObjectArrayCtrl($scope, filterFilter) {
// Fruits
$scope.fruits = [
{ name: 'apple', selected: true },
{ name: 'orange', selected: false },
{ name: 'pear', selected: true },
{ name: 'naartjie', selected: false }
];
// Selected fruits
$scope.selection = [];
// Helper method to get selected fruits
$scope.selectedFruits = function selectedFruits() {
return filterFilter($scope.fruits, { selected: true });
};
// Watch fruits for changes
$scope.$watch('fruits|filter:{selected:true}', function (nv) {
$scope.selection = nv.map(function (fruit) {
return fruit.name;
});
}, true);
}]);
Pour : Ajouter/supprimer est très facile
Cons : Structure de données un peu plus complexe et le basculement par nom est fastidieux ou nécessite une méthode d'aide.
Démo : http://jsbin.com/ImAqUC/1/
23 votes
Doit-il s'agir d'une liste ? Un objet conviendrait-il ?
<input type='checkbox' ng-model="checkboxes.apple">
etc. Le modèle serait : {"pomme":vrai, "orange":faux, "poire":vrai, "naartjie":vrai}2 votes
Essayez la directive dans ce Repo
1 votes
Assurez-vous de regarder au-delà de la réponse acceptée. Il y a une autre réponse ce qui est, à mon avis, beaucoup plus élégant.
5 votes
naartjie
! ? Cela vous trahit ! :D1 votes
@ppumkin hehe je viens de voir ça. Vous avez raison :D
0 votes
Pouvez-vous s'il vous plaît vérifier une question similaire que je n'arrive pas à résoudre : stackoverflow.com/questions/51573515/
0 votes
Hahaha leka man !