Il y a un tableau d'objets dans ma portée, je veux regarder toutes les valeurs de chaque objet.
Voici mon code:
function TodoCtrl($scope) {
$scope.columns = [
{ field:'title', displayName: 'TITLE'},
{ field: 'content', displayName: 'CONTENT' }
];
$scope.$watch('columns', function(newVal) {
alert('columns changed');
});
}
Mais quand je modifie les valeurs, par exemple je passe TITLE
à TITLE2
, le alert('columns changed')
jamais sauté.
Comment observer en profondeur les objets à l'intérieur d'un tableau?
Il y a une démo en direct: http://jsfiddle.net/SYx9b/
angular.equals
lorsque le troisième argument prend une valeur booléenne ?$watchCollection
$watchCollection
ne regardera que le "premier niveau" d'un tableau ou d'un objet, si je comprends bien. La réponse ci-dessus est correcte si vous devez regarder plus profondément que cela. bennadel.com/blog/…La plongée en profondeur d'un objet dans votre montre a des conséquences sur les performances. Parfois (par exemple, lorsque les modifications ne sont que des push et des pops), vous souhaiterez peut-être $ regarder une valeur facilement calculable, telle que array.length.
la source
Si vous ne regardez qu'un seul tableau, vous pouvez simplement utiliser ce morceau de code:
exemple
Mais cela ne fonctionnera pas avec plusieurs tableaux:
exemple
Pour gérer cette situation, je convertis généralement les multiples tableaux que je veux regarder en JSON:
exemple
Comme l'a souligné @jssebastian dans les commentaires, il
JSON.stringify
peut être préférableangular.toJson
car il peut gérer les membres commençant par «$» et d'autres cas possibles également.la source
$watch
, est-il capable de faire de même?Pass true as a third argument to watch an object's properties too.
Voir: cheatography.com/proloser/cheat-sheets/angularjsangular.toJson
sur une seule baie.Il convient de noter que dans Angular 1.1.x et supérieur, vous pouvez désormais utiliser $ watchCollection plutôt que $ watch. Bien que $ watchCollection semble créer des montres peu profondes, il ne fonctionnera donc pas avec des tableaux d'objets comme vous vous y attendez. Il peut détecter les ajouts et les suppressions au tableau, mais pas les propriétés des objets à l'intérieur des tableaux.
la source
Voici une comparaison des 3 façons dont vous pouvez regarder une variable de portée avec des exemples:
$ watch () est déclenché par:
$ watchCollection () est déclenché par tout ce qui précède ET:
$ watch (..., true) est déclenché par TOUT ci-dessus ET:
ENCORE UNE CHOSE...
$ watch () est le seul qui se déclenche lorsqu'un tableau est remplacé par un autre tableau même si cet autre tableau a le même contenu exact.
Par exemple, où
$watch()
tirerait et$watchCollection()
ne serait pas:Vous trouverez ci-dessous un lien vers un exemple JSFiddle qui utilise toutes les différentes combinaisons de montres et génère des messages de journal pour indiquer les "montres" qui ont été déclenchées:
http://jsfiddle.net/luisperezphd/2zj9k872/
la source
$ watchCollection accomplit ce que vous voulez faire. Ci-dessous, un exemple copié à partir du site Web angularjs http://docs.angularjs.org/api/ng/type/$rootScope.Scope Bien que cela soit pratique, les performances doivent être prises en considération, surtout lorsque vous regardez une grande collection.
la source
Cette solution a très bien fonctionné pour moi, je le fais dans une directive:
portée. $ watch (attrs.testWatch, function () {.....}, true);
le vrai fonctionne assez bien et réagit pour tous les changements (ajouter, supprimer ou modifier un champ).
Voici un plongeur de travail pour jouer avec.
Regarder en profondeur un tableau dans AngularJS
J'espère que cela peut vous être utile. Si vous avez des questions, n'hésitez pas à demander, je vais essayer de vous aider :)
la source
Dans mon cas, j'avais besoin de regarder un service, qui contient un objet adresse également surveillé par plusieurs autres contrôleurs. J'étais coincé dans une boucle jusqu'à ce que j'ajoute le «vrai» paramètre, qui semble être la clé du succès lors de l'observation d'objets.
la source
La définition du
objectEquality
paramètre (troisième paramètre) de la$watch
fonction est certainement la bonne façon de regarder TOUTES les propriétés du tableau.Piran répond assez bien à cette question et mentionne
$watchCollection
également.Plus de détails
La raison pour laquelle je réponds à une question déjà répondue est parce que je veux souligner que la réponse de wizardwerdna n'est pas bonne et ne doit pas être utilisée.
Le problème est que les résumés ne se font pas immédiatement. Ils doivent attendre la fin du bloc de code actuel avant de s'exécuter. Ainsi, regarder
length
un tableau peut manquer certains changements importants qui se$watchCollection
produiront.Supposons cette configuration:
À première vue, il peut sembler que ceux-ci se déclencheraient en même temps, comme dans ce cas:
Cela fonctionne assez bien, mais considérez ceci:
Notez que la longueur résultante était la même, même si le tableau a un nouvel élément et a perdu un élément, de sorte que watch as the
$watch
concern,length
n'a pas changé.$watchCollection
cependant.Le même résultat se produit avec un push and pop dans le même bloc.
Conclusion
Pour surveiller chaque propriété du tableau, utilisez un
$watch
sur le tableau lui-même avec le troisième paramètre (objectEquality) inclus et défini sur true. Oui, c'est cher mais parfois nécessaire.Pour regarder quand un objet entre / sort du tableau, utilisez a
$watchCollection
.N'utilisez PAS a
$watch
sur lalength
propriété du tableau. Il n'y a presque aucune bonne raison de penser à le faire.la source
la source