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.
$scope.$watch('columns', function(newVal) {
alert('columns changed');
},true); // <- Right here
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:
$scope.testArray = [
{val:1},
{val:2}
];
$scope.$watch('testArray.length', function(newLength, oldLength) {
console.log('length changed: ', oldLength, ' -> ', newLength);
});
$scope.$watchCollection('testArray', function(newArray) {
console.log('testArray changed');
});
A primera vista, puede parecer que se dispararían al mismo tiempo, como en este caso:
function pushToArray() {
$scope.testArray.push({val:3});
}
pushToArray();
// Console output
// length changed: 2 -> 3
// testArray changed
Eso funciona bastante bien, pero considera esto:
function spliceArray() {
// Starting at index 1, remove 1 item, then push {val: 3}.
$testArray.splice(1, 1, {val: 3});
}
spliceArray();
// Console output
// testArray changed
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í.
function pushPopArray() {
$testArray.push({val: 3});
$testArray.pop();
}
pushPopArray();
// Console output
// testArray change
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 la length
propiedad de la matriz. Casi no hay una buena razón para pensar en hacerlo.
angular.equals
cuando el tercer argumento toma un valor booleano ?