J'essaie d'écrire une fonction qui me permet de supprimer un élément lorsque le bouton est cliqué, mais je pense que je suis confus avec la fonction - dois-je utiliser $digest
?
HTML et app.js:
<ul ng-repeat="bday in bdays">
<li>
<span ng-hide="editing" ng-click="editing = true">{{bday.name}} | {{bday.date}}</span>
<form ng-show="editing" ng-submit="editing = false">
<label>Name:</label>
<input type="text" ng-model="bday.name" placeholder="Name" ng-required/>
<label>Date:</label>
<input type="date" ng-model="bday.date" placeholder="Date" ng-required/>
<br/>
<button class="btn" type="submit">Save</button>
<a class="btn" ng-click="remove()">Delete</a>
</form>
</li>
</ul>
$scope.remove = function(){
$scope.newBirthday = $scope.$digest();
};
remove()
dansng-click
la façon dont vous l'avez n'a pas de contexte. Besoin de plus de détails dans le balisage pour montrer ce qui est supprimé et s'il se trouve à l'intérieurng-repeat
, d'où vient l'élément supprimé ou quel comportement vous souhaitezremove()
Réponses:
Pour supprimer un élément, vous devez le supprimer du tableau et pouvez transmettre l'
bday
élément à votre fonction de suppression dans le balisage. Ensuite, dans le contrôleur, recherchez l'index de l'élément et supprimez-le du tableauPuis dans le contrôleur:
Angular détectera automatiquement la modification de la
bdays
baie et effectuera la mise à jour deng-repeat
DÉMO: http://plnkr.co/edit/ZdShIA?p=preview
EDIT: si faire des mises à jour en direct avec le serveur utiliserait un service que vous créez en utilisant
$resource
pour gérer les mises à jour de la baie en même temps qu'il met à jour le serveurla source
$index
directe peut générer des bugs si votre liste est filtrée sur un modèle. C'est une chose modèle; il est plus sûr d'utiliserng-click='remove(bday)'
alorsarr.splice(arr.indexOf(bday),1);
this is undefined
. Plunker / jsfiddle peut-être?.indexOf(item)
renverra -1 s'il n'est pas trouvé, cela pourrait entraîner la suppression de l'élément à la fin du tableau si vous ne le vérifiez pas.Ceci est une bonne réponse:
Dans la réponse de @ charlietfl. Je pense que c'est faux puisque vous passez
$index
en paramètre mais vous utilisez plutôt le souhait dans le contrôleur. Corrige moi si je me trompe :)la source
indexOf
Fonctionne UNIQUEMENT si c'est IE9 +Dans le cas où vous êtes à l'intérieur d'une répétition ng
vous pouvez utiliser une option de doublure
$index
est utilisé par angulaire pour afficher l'index actuel du tableau à l'intérieurng-repeat
la source
L'utilisation
$index
fonctionne parfaitement dans les cas de base, et la réponse de @ charlietfl est excellente. Mais parfois, ce$index
n'est pas suffisant.Imaginez que vous ayez un seul tableau, que vous présentez dans deux ng-répétitions différentes. L'un de ces ng-repeat est filtré pour les objets qui ont une propriété true, et l'autre est filtré pour une propriété falsy. Deux tableaux filtrés différents sont présentés, qui dérivent d'un seul tableau d'origine. (Ou, si cela aide à visualiser: peut-être que vous avez un seul tableau de personnes et que vous voulez une répétition ng pour les femmes de ce tableau et une autre pour les hommes de ce même tableau .) Votre objectif: supprimer de manière fiable du tableau d'origine, en utilisant les informations des membres des tableaux filtrés.
Dans chacun de ces tableaux filtrés, $ index ne sera pas l'index de l'élément dans le tableau d'origine. Ce sera l'index dans le sous-tableau filtré . Ainsi, vous ne pourrez pas dire l'index de la personne dans le
people
tableau d' origine , vous ne connaîtrez que l'index $ duwomen
ou dumen
sous-tableau. Essayez de supprimer en utilisant cela, et vous aurez des éléments disparaissant de partout sauf là où vous le vouliez. Que faire?Si vous avez la chance d'utiliser un modèle de données comprenant un identifiant unique pour chaque objet, utilisez-le au lieu de $ index, pour trouver l'objet et
splice
le sortir du tableau principal. (Utilisez mon exemple ci-dessous, mais avec cet identifiant unique.) Mais si vous n'êtes pas aussi chanceux?Angular augmente en fait chaque élément dans un tableau ng-répété (dans le tableau principal d'origine) avec une propriété unique appelée
$$hashKey
. Vous pouvez rechercher dans le tableau d'origine une correspondance avec l'$$hashKey
élément que vous souhaitez supprimer et vous en débarrasser de cette façon.Notez qu'il
$$hashKey
s'agit d'un détail d'implémentation, non inclus dans l'API publiée pour ng-repeat. Ils pouvaient retirer le support de cette propriété à tout moment. Mais probablement pas. :-)Invoquer avec:
EDIT: L'utilisation d'une fonction comme celle-ci, qui clique sur au
$$hashKey
lieu d'un nom de propriété spécifique au modèle, a également l'avantage supplémentaire significatif de rendre cette fonction réutilisable dans différents modèles et contextes. Fournissez-lui votre référence de tableau et votre référence d'élément, et cela devrait simplement fonctionner.la source
J'écris généralement dans un tel style:
J'espère que cela vous aidera Vous devez utiliser un point (.) Entre $ scope et [yourArray]
la source
deleteCount
. Un entier indiquant le nombre d'anciens éléments de tableau à supprimer. Si deleteCount vaut 0, aucun élément n'est supprimé. Dans ce cas, vous devez spécifier au moins un nouvel élément. Si deleteCount est supérieur au nombre d'éléments restant dans le tableau à partir du début, tous les éléments jusqu'à la fin du tableau seront supprimés. Documentation de Array.prototype.splice ()S'appuyant sur la réponse acceptée, cela fonctionnera avec
ngRepeat
,filter
et poignée expections mieux:Manette:
Vue:
la source
mise en œuvre sans contrôleur.
La méthode splice () ajoute / supprime des éléments vers / depuis un tableau.
index : obligatoire. Un entier qui spécifie à quelle position ajouter / supprimer des éléments. Utilisez des valeurs négatives pour spécifier la position à partir de la fin du tableau.
howmanyitem (s) : Facultatif. Le nombre d'éléments à supprimer. S'il est défini sur 0, aucun élément ne sera supprimé.
item_1, ..., item_n : facultatif. Le ou les nouveaux éléments à ajouter au tableau
la source
Je ne suis pas d'accord pour que vous appeliez une méthode sur votre contrôleur. Vous devez utiliser un service pour toute fonctionnalité réelle, et vous devez définir des directives pour toute fonctionnalité d'évolutivité et de modularité, ainsi que l'attribution d'un événement de clic qui contient un appel au service que vous injectez dans votre directive.
Ainsi, par exemple, sur votre HTML ...
Ensuite, créez une directive ...
Alors à votre service ...
Lorsque vous écrivez correctement votre code comme celui-ci, vous faciliterez l'écriture de modifications futures sans avoir à restructurer votre code. Il est organisé correctement et vous gérez correctement les événements de clic personnalisés en liant à l'aide de directives personnalisées.
Par exemple, si votre client dit: "Hé, maintenant faisons-le appeler le serveur et faire du pain, puis ouvrez un modal". Vous pourrez facilement accéder simplement au service lui-même sans avoir à ajouter ou à modifier le code HTML et / ou le code de la méthode du contrôleur. Si vous n'aviez qu'une seule ligne sur le contrôleur, vous auriez éventuellement besoin d'utiliser un service, pour étendre la fonctionnalité au levage plus lourd que le client demande.
De plus, si vous avez besoin d'un autre bouton 'Supprimer' ailleurs, vous avez maintenant un attribut de directive ('ng-remove-birthday') que vous pouvez facilement affecter à n'importe quel élément de la page. Cela le rend désormais modulaire et réutilisable. Cela vous sera utile lorsque vous aurez affaire au paradigme des composants Web HEAVY d'Angular 2.0. Il n'y a pas de contrôleur en 2.0. :)
Bon développement !!!
la source
Voici une autre réponse. J'espère que cela aidera.
La source complète est ici
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
la source
si vous avez un ID ou un champ spécifique dans votre article, vous pouvez utiliser filter (). son acte comme Where ().
dans le contrôleur:
la source
du contrôleur (la fonction peut être dans le même contrôleur mais préfère la garder dans un service)
la source