$observe() est une méthode sur le Attributs et, en tant que tel, il ne peut être utilisé que pour observer/suivre le changement de valeur d'un attribut DOM. Il n'est utilisé/appelé qu'à l'intérieur de directives. Utilisez $observe lorsque vous devez observer/suivre un attribut DOM qui contient une interpolation (c'est-à-dire des {{}}).
Par exemple, attr1="Name: {{name}}"
puis dans une directive : attrs.$observe('attr1', ...)
.
(Si vous essayez scope.$watch(attrs.attr1, ...)
ça ne marchera pas à cause des {{}} -- vous obtiendrez undefined
.) Utilisez $watch pour tout le reste.
$watch() est plus compliqué. Il peut observer/suivre une "expression", où l'expression peut être soit une fonction, soit une chaîne de caractères. Si l'expression est une chaîne de caractères, elle est $parse (c'est-à-dire évaluée comme une Expression angulaire ) en une fonction. (C'est cette fonction qui est appelée à chaque cycle du digest). L'expression de la chaîne ne peut pas contenir de {{}}. $watch est une méthode de la classe Portée de sorte qu'il peut être utilisé/appelé partout où l'on a accès à un objet scope, d'où l'utilisation de la fonction
- un contrôleur -- n'importe quel contrôleur -- un contrôleur créé via ng-view, ng-controller, ou un contrôleur directive
- une fonction de liaison dans une directive, puisqu'elle a également accès à une portée.
Les chaînes étant évaluées comme des expressions Angular, $watch est souvent utilisé lorsque vous souhaitez observer/suivre une propriété de modèle/scope. Par exemple, attr1="myModel.some_prop"
puis dans une fonction de contrôleur ou de liaison : scope.$watch('myModel.some_prop', ...)
ou scope.$watch(attrs.attr1, ...)
(ou scope.$watch(attrs['attr1'], ...)
).
(Si vous essayez attrs.$observe('attr1')
vous obtiendrez la chaîne myModel.some_prop
ce qui n'est probablement pas ce que vous voulez).
Comme indiqué dans les commentaires sur la réponse de @PrimosK, tous les $observes et $watches sont vérifiés tous les jours. cycle digestif .
Les directives avec isolate scopes sont plus compliquées. Si la syntaxe '@' est utilisée, vous pouvez $observer ou $watch un attribut DOM qui contient une interpolation (c'est-à-dire des {{}}). (La raison pour laquelle cela fonctionne avec $watch est que la syntaxe '@' permet de faire l'interpolation. interpolation pour nous, donc $watch voit une chaîne sans {{}}). Pour qu'il soit plus facile de se rappeler lequel utiliser quand, je suggère d'utiliser $observe dans ce cas également.
Pour aider à tester tout cela, j'ai écrit une Plunker qui définit deux directives. La première ( d1
) ne crée pas de nouvelle portée, l'autre ( d2
) crée une portée isolée. Chaque directive possède les six mêmes attributs. Chaque attribut est à la fois $observe'd et $watch'ed.
<div d1 attr1="{{prop1}}-test" attr2="prop2" attr3="33" attr4="'a_string'"
attr5="a_string" attr6="{{1+aNumber}}"></div>
Regardez le journal de la console pour voir les différences entre $observe et $watch dans la fonction de liaison. Ensuite, cliquez sur le lien et voyez quels $observes et $watches sont déclenchés par les changements de propriétés effectués par le gestionnaire de clics.
Notez que lorsque la fonction de liaison s'exécute, tous les attributs qui contiennent des {{}} ne sont pas encore évalués (si vous essayez d'examiner les attributs, vous obtiendrez donc undefined
). La seule façon de voir les valeurs interpolées est d'utiliser $observe (ou $watch si vous utilisez une portée isolée avec '@'). Par conséquent, pour obtenir les valeurs de ces attributs, il faut utiliser asynchrone fonctionnement. (Et c'est pourquoi nous avons besoin des fonctions $observe et $watch).
Parfois, vous n'avez pas besoin de $observe ou de $watch. Par exemple, si votre attribut contient un nombre ou un booléen (et non une chaîne), il suffit de l'évaluer une fois : attr1="22"
puis dans, disons, votre fonction de liaison : var count = scope.$eval(attrs.attr1)
. Si c'est juste une chaîne constante - attr1="my string"
- alors utilisez simplement attrs.attr1
dans votre directive (pas besoin de $eval()).
Voir aussi Le post du groupe google de Vojta à propos des expressions $watch.
1 votes
Votre montage n'est pas utile et est un peu antagoniste. S'il vous plaît, soyez prévenant pour les autres qui viennent ici pour une aide réelle.
0 votes
@smalone a changé. Merci et désolé !
0 votes
Pas d'inquiétude. Merci de l'avoir réparé.