Hay una variedad de objetos en mi alcance, quiero ver todos los valores de cada objeto.
Este es mi código:
function TodoCtrl($scope) {
$scope.columns = [
{ field:'title', displayName: 'TITLE'},
{ field: 'content', displayName: 'CONTENT' }
];
$scope.$watch('columns', function(newVal) {
alert('columns changed');
});
}
Pero cuando modifico los valores, por ejemplo, cambio TITLE
a TITLE2
, alert('columns changed')
nunca aparece.
¿Cómo mirar profundamente los objetos dentro de una matriz?
Hay una demostración en vivo: http://jsfiddle.net/SYx9b/
angular.equals
cuando el tercer argumento toma un valor booleano ?$watchCollection
$watchCollection
solo veré el "primer nivel" de una matriz u objeto, según tengo entendido. La respuesta anterior es correcta si necesita mirar más profundo que eso. bennadel.com/blog/…Hay consecuencias de rendimiento al sumergirse en un objeto en su $ watch. A veces (por ejemplo, cuando los cambios son solo empujones y estallidos), es posible que desee $ mirar un valor fácilmente calculado, como array.length.
fuente
Si va a ver solo una matriz, simplemente puede usar este bit de código:
ejemplo
Pero esto no funcionará con múltiples matrices:
ejemplo
Para manejar esta situación, generalmente convierto las múltiples matrices que quiero ver en JSON:
ejemplo
Como @jssebastian señaló en los comentarios,
JSON.stringify
puede ser preferibleangular.toJson
ya que puede manejar miembros que comienzan con '$' y otros posibles casos también.fuente
$watch
, ¿es capaz de hacer lo mismo?Pass true as a third argument to watch an object's properties too.
Ver: cheatography.com/proloser/cheat-sheets/angularjsangular.toJson
en una sola matriz.Vale la pena señalar que en Angular 1.1.xy superior, ahora puede usar $ watchCollection en lugar de $ watch. Aunque $ watchCollection parece crear relojes poco profundos, por lo que no funcionará con conjuntos de objetos como usted espera. Puede detectar adiciones y eliminaciones a la matriz, pero no las propiedades de los objetos dentro de las matrices.
fuente
Aquí hay una comparación de las 3 formas en que puede ver una variable de alcance con ejemplos:
$ watch () se activa por:
$ watchCollection () se activa por todo lo anterior Y:
$ watch (..., true) se activa por TODO lo anterior Y:
SOLO UNA COSA MÁS...
$ watch () es el único que se activa cuando una matriz se reemplaza por otra matriz, incluso si esa otra matriz tiene el mismo contenido exacto.
Por ejemplo, dónde
$watch()
se dispararía y$watchCollection()
no:A continuación hay un enlace a un ejemplo de JSFiddle que utiliza todas las diferentes combinaciones de relojes y envía mensajes de registro para indicar qué "relojes" se activaron:
http://jsfiddle.net/luisperezphd/2zj9k872/
fuente
$ watchCollection logra lo que quieres hacer. A continuación se muestra un ejemplo copiado del sitio web de angularjs http://docs.angularjs.org/api/ng/type/$rootScope.Scope Si bien es conveniente, el rendimiento debe tenerse en cuenta especialmente cuando mira una gran colección.
fuente
Esta solución funcionó muy bien para mí, estoy haciendo esto en una directiva:
alcance. $ watch (attrs.testWatch, function () {.....}, true);
Lo verdadero funciona bastante bien y reacciona para todos los cambios (agregar, eliminar o modificar un campo).
Aquí hay un saqueador para jugar con él.
Mirando profundamente una matriz en AngularJS
Espero que esto te sea útil. Si tiene alguna pregunta, no dude en preguntar, intentaré ayudar :)
fuente
En mi caso, necesitaba ver un servicio, que contiene un objeto de dirección también observado por varios otros controladores. Estaba atrapado en un bucle hasta que agregué el parámetro 'verdadero', que parece ser la clave del éxito al mirar objetos.
fuente
Definir el
objectEquality
parámetro (tercer parámetro) de la$watch
función es definitivamente la forma correcta de ver TODAS las propiedades de la matriz.Piran responde esto bastante bien y menciona
$watchCollection
también.Mas detalle
La razón por la que estoy respondiendo una pregunta ya respondida es porque quiero señalar que la respuesta de wizardwerdna no es buena y no debe usarse.
El problema es que los resúmenes no ocurren de inmediato. Tienen que esperar hasta que el bloque de código actual se haya completado antes de ejecutar. Por lo tanto, ver cómo
length
una matriz puede perder algunos cambios importantes que$watchCollection
atraparán.Asuma esta configuración:
A primera vista, puede parecer que se dispararían al mismo tiempo, como en este caso:
Eso funciona bastante bien, pero considera esto:
Tenga en cuenta que la longitud resultante fue la misma a pesar de que la matriz tiene un nuevo elemento y perdió un elemento, por lo que, en lo que
$watch
respecta al reloj ,length
no ha cambiado.$watchCollection
Sin embargo, lo entendí.El mismo resultado ocurre con un push y pop en el mismo bloque.
Conclusión
Para ver todas las propiedades de la matriz, use a
$watch
en la matriz con el tercer parámetro (objectEquality) incluido y establecido en verdadero. Sí, esto es costoso pero a veces necesario.Para ver cuándo el objeto entra / sale de la matriz, use a
$watchCollection
.NO use a
$watch
en lalength
propiedad de la matriz. Casi no hay una buena razón para pensar en hacerlo.fuente
fuente