Definir el objectEqualityparámetro (tercer parámetro) de la $watchfunció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 $watchCollectiontambié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 lengthuna matriz puede perder algunos cambios importantes que $watchCollectionatrapará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 $watchrespecta al reloj , lengthno ha cambiado. $watchCollectionSin 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 $watchen 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 $watchen la lengthpropiedad de la matriz. Casi no hay una buena razón para pensar en hacerlo.
angular.equalscuando el tercer argumento toma un valor booleano ?