¿Cuáles son las diferencias entre estos métodos de reloj en angularJS?

Consulte “Alcance $ profundidades de vigilancia” en https://docs.angularjs.org/guide…. Dentro hay un gráfico particularmente útil:

Apuntando a una propiedad $scope que es un ‘objeto con propiedades de matriz’ (si entiendo la pregunta correctamente), he demostrado algunas de las diferentes configuraciones de $watcher en el fragmento a continuación para que pueda ver los diversos comportamientos en acción.

Mostrar fragmento de código

( Plnkr <- para una experimentación más fácil)

$ watch (…, …, cierto)

Como puede ver en el fragmento, si desea garantizar que detecte cada pequeño cambio en una estructura de objeto / matriz anidada , use $scope.$watch(..., ..., true) , donde el tercer parámetro causa el observador para hacer una comparación profunda de cada propiedad dentro de sus objetos / matrices. Sin embargo, es relativamente pesado hacer esto, así que tenga en cuenta que puede haber algunas implicaciones de rendimiento en objetos grandes.

$ watch (function () {}, …, …)

Sin embargo, el formato $scope.$watch(function() {...}, ...) realmente le da mucha más flexibilidad de la que he demostrado en el fragmento, donde básicamente solo estoy devolviendo el objeto. El valor de retorno de su función se comparará con su valor de retorno anterior (cada vez que se ejecuta un $digest ), por lo que si desea que se active la función de escucha, debe devolver un valor diferente en los momentos correctos. Idealmente, desea que esta función sea bastante ligera y simple por razones de rendimiento (¡se ejecutará mucho!), Pero dependiendo de los datos que necesite ver, podría implementar una solución de mejor rendimiento que $scope.$watch(..., ..., true) .

$ watchCollection (…, …)

Como puede ver en el fragmento, esto responde solo a cambios superficiales de la colección (ya sea un objeto o una matriz): notará si se agrega, elimina, mueve y si contiene un valor básico como una Cadena, Número, booleano, etc., notará si cambia. Sin embargo, si su colección contiene más Objetos / Matrices anidados, no notará cambios dentro de ellos (son demasiado profundos). Por lo tanto, la necesidad de cualquiera de las dos implementaciones de $watch .

ng-event

Si los cambios en el modelo que le interesan solo son causados ​​por la entrada del usuario, recuerde también considerar si puede usar eventos ng-change o ng-blur (etc.) en los controles de formulario en lugar de observadores en el modelo, ya que estos probablemente sea mucho mejor desempeño.