Liste simple à faire, mais avec un bouton de suppression sur la page de liste pour chaque élément:
Modèle HTML pertinent:
<tr ng-repeat="person in persons">
<td>{{person.name}} - # {{person.id}}</td>
<td>{{person.description}}</td>
<td nowrap=nowrap>
<a href="#!/edit"><i class="icon-edit"></i></a>
<button ng-click="delete(person)"><i class="icon-minus-sign"></i></button>
</td>
</tr>
Méthode de contrôleur pertinente:
$scope.delete = function (person) {
API.DeletePerson({ id: person.id }, function (success) {
// I need some code here to pull the person from my scope.
});
};
J'ai essayé $scope.persons.pull(person)
et $scope.persons.remove(person)
.
Bien que la base de données ait été supprimée avec succès, je ne peux pas extraire cet élément de la portée et je ne souhaite pas appeler de méthode sur le serveur pour les données que possède déjà le client. Je souhaite simplement supprimer cette personne de la portée.
Des idées?
Votre problème ne concerne pas vraiment Angular, mais les méthodes Array. La bonne façon de supprimer un élément particulier d'un tableau est d'utiliser Array.splice
. De même, lorsque vous utilisez ng-repeat, vous avez accès à la propriété spéciale _$index
_, qui correspond à l'index actuel du tableau que vous avez transmis.
La solution est en fait assez simple:
Vue:
_<a ng-click="delete($index)">Delete</a>
_
Contrôleur:
_$scope.delete = function ( idx ) {
var person_to_delete = $scope.persons[idx];
API.DeletePerson({ id: person_to_delete.id }, function (success) {
$scope.persons.splice(idx, 1);
});
};
_
Vous devrez trouver l'index de person
dans votre tableau persons
, puis utiliser la méthode du tableau splice
:
$scope.persons.splice( $scope.persons.indexOf(person), 1 );
Je voudrais utiliser la bibliothèque nderscore.js qui contient une liste de fonctions utiles.
without
without_.without(array, *values)
Retourne une copie du tableau avec toutes les occurrences des valeurs supprimées.
_.without([1, 2, 1, 0, 3, 1, 4], 0, 1); // => [2, 3, 4]
var res = "deleteMe";
$scope.nodes = [
{
name: "Node-1-1"
},
{
name: "Node-1-2"
},
{
name: "deleteMe"
}
];
$scope.newNodes = _.without($scope.nodes, _.findWhere($scope.nodes, {
name: res
}));
Voir Demo dans JSFiddle .
filter
var evens = _.filter([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; }); // => [2, 4, 6]
$scope.newNodes = _.filter($scope.nodes, function(node) {
return !(node.name == res);
});
Voir la démo dans violon .
$scope.removeItem = function() {
$scope.items.splice($scope.toRemove, 1);
$scope.toRemove = null;
};
cela fonctionne pour moi!
Si une fonction est associée à la liste, l'association est également supprimée lorsque vous créez la fonction de raccordement. Ma solution:
$scope.remove = function() {
var oldList = $scope.items;
$scope.items = [];
angular.forEach(oldList, function(x) {
if (! x.done) $scope.items.Push( { [ DATA OF EACH ITEM USING oldList(x) ] });
});
};
La liste param est nommée articles. Le param x.done indiquer si l'élément sera supprimé.
Autres références: n autre exemple
J'espère vous aider. Salutations.
Vous pouvez aussi utiliser ceci
$scope.persons = $filter('filter')($scope.persons , { id: ('!' + person.id) });
Car la réponse acceptée de @Joseph Silber ne fonctionne pas, car indexOf renvoie -1. C'est probablement parce que Angular ajoute une clé de hachage, ce qui est différent pour mon $ scope.items [0] et mon élément. J'ai essayé de résoudre ce problème avec la fonction angular.toJson (), mais cela n'a pas fonctionné :(
Ah, j'ai découvert la raison ... J'utilise une méthode de type chunk pour créer deux colonnes dans ma table en surveillant mes $ scope.items. Pardon!
array.splice(array.pop(item));
Angular possède une fonction intégrée appelée arrayRemove
, dans votre cas, la méthode peut être simplement:
arrayRemove($scope.persons, person)
Pour supprimer un élément de la portée, utilisez:
// remove an item
$scope.remove = function(index) {
$scope.items.splice(index, 1);
};