$regarder un objet
Je veux regarder les changements dans un dictionnaire, mais pour une raison de regarder le rappel n'est pas appelé.
Ici est 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');
});
}
Ici est violon.
J'attends $regarder de rappel pour être déclenché à chaque fois que le nom ou le prénom est changé, mais ça n'arrivera pas.
Quelle est la bonne façon de le faire?
- double possible de Comment profonde regarder un tableau dans angularjs?
Vous devez vous connecter pour publier un commentaire.
Appel
$watch
avectrue
en tant que troisième argument:Par défaut lorsque l'on compare deux objets complexes en JavaScript, ils seront vérifiés pour "référence" de l'égalité, qui demande si les deux objets font référence à la même chose, plutôt que de la "valeur" de l'égalité, qui vérifie si les valeurs de toutes les propriétés de ces objets sont égaux.
Par la Angulaire de la documentation, le troisième paramètre est pour
objectEquality
:true
, puis il va vérifier pour la référence à l'égalité si l'regardé la valeur est un objet ou un tableau. Dans ce cas, vous devez spécifier les propriétés explicitement, comme$scope.$watch('form.name')
et$scope.$watch('form.surname')
La
form
objet ne change pas, seule laname
propriété estmis à jour violon
Peu performances de pointe si quelqu'un a une banque de données type de service avec la touche -> valeur de paires:
Si vous avez un service appelé de la banque de données, vous pouvez mettre à jour un timestamp à chaque fois que votre big data de l'objet de modifications.
De cette façon, au lieu de profonde regarder l'ensemble de l'objet, vous êtes seulement en regardant un timestamp pour le changement.
Et dans une directive, vous êtes seulement en regardant le timestamp de changer
newVal
,oldVal
dans cet exemple sont les valeurs timestamp qu'on a pu observer des objets de valeurs. Il ne fait pas de cette réponse non valide, je pense juste que c'est un inconvénient qui est digne de mention.La raison pour laquelle votre code ne fonctionne pas est parce que
$watch
par défaut de vérification des références. Donc, en un mot c'assurez-vous que l'objet qui est passé est un nouvel objet. Mais dans votre cas, vous êtes juste la modification de certaines propriétés de l'objet de formulaire pas en créer un nouveau. Afin de faire le travail que vous pouvez passertrue
comme troisième paramètre.Cela va fonctionner, mais Vous pouvez utiliser $watchCollection qui seront plus efficaces, alors $de regarder parce que
$watchCollection
vais regarder pour les propriétés de l'objet de formulaire. E. g.Que vous êtes à la recherche pour la forme de l'objet de modifications, le meilleur regardant approche consiste à utiliser
$watchCollection
. Veuillez regarder dans officiel la documentation pour les différentes caractéristiques de performance.Essayez ceci:
Pour quelqu'un qui veut regarder pour un changement à un objet dans un tableau d'objets, cela semblait fonctionner pour moi (comme les autres solutions sur cette page n'ont pas):