in

javascript – AngularJS: diferencia entre los métodos $ observe y $ watch

apple touch icon@2

$ observar () es un método en el Atributos objeto, y como tal, solo se puede usar para observar / observar el cambio de valor de un atributo DOM. Solo se usa / llama dentro de las directivas. Utilice $ observe cuando necesite observar / observar un atributo DOM que contenga interpolación (es decir, {{}}).

P.ej, attr1="Name: {{name}}", luego en una directiva: attrs.$observe('attr1', ...).

(Si intentas scope.$watch(attrs.attr1, ...) no funcionará debido a las {{}} s; obtendrá undefined.) Utilice $ watch para todo lo demás.

$ reloj () es más complicado. Puede observar / observar una «expresión», donde la expresión puede ser una función o una cadena. Si la expresión es una cadena, es $ parse‘d (es decir, evaluado como Expresión angular) en una función. (Es esta función la que se llama cada ciclo de resumen). La expresión de cadena no puede contener {{}}. $ watch es un método en el Alcance objeto, por lo que se puede usar / llamar siempre que tenga acceso a un objeto de alcance, por lo tanto, en

  • un controlador, cualquier controlador, uno creado a través de ng-view, ng-controller o un controlador de directiva
  • una función de enlace en una directiva, ya que también tiene acceso a un alcance

Debido a que las cadenas se evalúan como expresiones angulares, $ watch se usa a menudo cuando desea observar / observar una propiedad de modelo / alcance. P.ej, attr1="myModel.some_prop", luego en un controlador o función de enlace: scope.$watch('myModel.some_prop', ...) o scope.$watch(attrs.attr1, ...) (o scope.$watch(attrs['attr1'], ...)).

(Si intentas attrs.$observe('attr1') obtendrás la cuerda myModel.some_prop, que probablemente no sea lo que quieres).

Como se discutió en los comentarios sobre la respuesta de @ PrimosK, todos los $ observes y $ watches se verifican cada ciclo de digestión.

Las directivas con ámbitos aislados son más complicadas. Si se usa la sintaxis ‘@’, puede $ observar o $ ver un atributo DOM que contiene interpolación (es decir, {{}}). (La razón por la que funciona con $ watch es porque la sintaxis ‘@’ hace la interpolación para nosotros, por lo tanto, $ watch ve una cadena sin {{}}.) Para que sea más fácil recordar cuál usar cuando, sugiero usar $ observe también para este caso.

Para ayudar a probar todo esto, escribí un Plunker que define dos directivas. Uno (d1) no crea un nuevo alcance, el otro (d2) crea un ámbito aislado. Cada directiva tiene los mismos seis atributos. Cada atributo es tanto $ observado como $ vigilado.

<div d1 attr1="{{prop1}}-test" attr2="prop2" attr3="33" attr4="'a_string'"
        attr5="a_string" attr6="{{1+aNumber}}"></div>

Mire el registro de la consola para ver las diferencias entre $ observe y $ watch en la función de vinculación. Luego haga clic en el enlace y vea qué $ observa y $ relojes son activados por los cambios de propiedad realizados por el controlador de clics.

Tenga en cuenta que cuando se ejecuta la función de enlace, los atributos que contienen {{}} todavía no se evalúan (por lo tanto, si intenta examinar los atributos, obtendrá undefined). La única forma de ver los valores interpolados es usar $ observe (o $ watch si usa un alcance aislado con ‘@’). Por lo tanto, obtener los valores de estos atributos es una asincrónico operación. (Y esta es la razón por la que necesitamos las funciones $ observe y $ watch).

A veces no es necesario $ observar o $ mirar. Por ejemplo, si su atributo contiene un número o un valor booleano (no una cadena), evalúelo una vez: attr1="22", luego en, digamos, su función de enlace: var count = scope.$eval(attrs.attr1). Si es solo una cadena constante – attr1="my string" – entonces solo usa attrs.attr1 en su directiva (no es necesario $ eval ()).

Ver también Publicación del grupo de google de Vojta sobre $ ver expresiones.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

SQL: clave externa

gfg 200x200 min

Python | Convertir una lista en diccionario