Je veux surveiller les changements dans un dictionnaire, mais pour une raison quelconque, le rappel de la montre n'est pas appelé.
Voici un contrôleur que j'utilise:
function MyController($scope) {
$scope.form = {
name: 'my name',
surname: 'surname'
}
$scope.$watch('form', function(newVal, oldVal){
console.log('changed');
});
}
Voici le violon .
Je m'attends à ce que le rappel $ watch soit déclenché à chaque changement de nom ou de prénom, mais cela ne se produit pas.
Quelle est la bonne façon de procéder?
javascript
angularjs
angularjs-scope
Vladimir Sidorenko
la source
la source
Réponses:
Appelez
$watch
avectrue
comme troisième argument:Par défaut, lors de la comparaison de deux objets complexes en JavaScript, leur égalité de "référence" sera vérifiée, ce qui demandera si les deux objets se réfèrent à la même chose, plutôt que l'égalité de "valeur", qui vérifie si les valeurs de toutes les propriétés de celles-ci les objets sont égaux.
Selon la documentation angulaire , le troisième paramètre est pour
objectEquality
:la source
true
, il vérifiera l'égalité de référence si la valeur surveillée est un objet ou un tableau. Dans ce cas, vous devez spécifier explicitement les propriétés, comme$scope.$watch('form.name')
et$scope.$watch('form.surname')
L'
form
objet ne change pas, seule laname
propriété estviolon mis à jour
la source
Petit conseil de performance si quelqu'un a un type de service de banque de données avec des paires clé -> valeur:
Si vous disposez d'un service appelé dataStore , vous pouvez mettre à jour un horodatage chaque fois que votre objet Big Data change. De cette façon, au lieu de regarder en profondeur l'objet entier, vous ne regardez qu'un horodatage pour le changement.
Et dans une directive, vous ne regardez que l'horodatage pour changer
la source
newVal
,oldVal
dans cet exemple, les valeurs d'horodatage ne sont pas les valeurs d'objets observées. Cela ne rend pas cette réponse invalide, je pense simplement que c'est un inconvénient qui mérite d'être mentionné.La raison pour laquelle votre code ne fonctionne pas est que,
$watch
par défaut, il vérifie les références. Donc, en un mot, il s'assure que l'objet qui lui est transmis est un nouvel objet. Mais dans votre cas, vous modifiez simplement certaines propriétés d'un objet de formulaire et n'en créez pas de nouvelles. Pour le faire fonctionner, vous pouvez passertrue
comme troisième paramètre.Cela fonctionnera mais vous pouvez utiliser $ watchCollection qui sera plus efficace que $ watch car
$watchCollection
surveillera les propriétés superficielles sur l'objet de formulaire. Par exemplela source
Lorsque vous recherchez des modifications d'objet de formulaire, la meilleure approche de surveillance consiste à utiliser
$watchCollection
. Veuillez consulter la documentation officielle pour les différentes caractéristiques de performance.la source
Essaye ça:
la source
Pour tous ceux qui souhaitent surveiller la modification d'un objet dans un tableau d'objets, cela semble fonctionner pour moi (contrairement aux autres solutions de cette page):
la source
la source