L'impostazione del objectEquality
parametro (terzo parametro) della $watch
funzione è sicuramente il modo corretto di controllare TUTTE le proprietà dell'array.
$scope.$watch('columns', function(newVal) {
alert('columns changed');
},true); // <- Right here
Piran risponde abbastanza bene e menziona $watchCollection
anche.
Più dettaglio
Il motivo per cui sto rispondendo a una domanda già risposta è perché voglio sottolineare che la risposta di Wizardwerdna non è buona e non dovrebbe essere usata.
Il problema è che i digest non avvengono immediatamente. Devono attendere il completamento dell'attuale blocco di codice prima di eseguire. Quindi, guardare il length
di un array potrebbe effettivamente mancare alcune importanti modifiche che $watchCollection
cattureranno.
Supponi questa configurazione:
$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 prima vista, potrebbe sembrare che questi sparerebbero contemporaneamente, come in questo caso:
function pushToArray() {
$scope.testArray.push({val:3});
}
pushToArray();
// Console output
// length changed: 2 -> 3
// testArray changed
Funziona abbastanza bene, ma considera questo:
function spliceArray() {
// Starting at index 1, remove 1 item, then push {val: 3}.
$testArray.splice(1, 1, {val: 3});
}
spliceArray();
// Console output
// testArray changed
Si noti che la lunghezza risultante era la stessa anche se l'array ha un nuovo elemento e ha perso un elemento, quindi, per quanto riguarda l'orologio $watch
, length
non è cambiato. $watchCollection
raccolto su di esso, però.
function pushPopArray() {
$testArray.push({val: 3});
$testArray.pop();
}
pushPopArray();
// Console output
// testArray change
Lo stesso risultato si verifica con un push e pop nello stesso blocco.
Conclusione
Per guardare tutte le proprietà dell'array, utilizzare $watch
a sull'array stesso con il terzo parametro (objectEquality) incluso e impostato su true. Sì, questo è costoso ma a volte necessario.
Per vedere quando l'oggetto entra / esce dall'array, usare a $watchCollection
.
NON utilizzare a $watch
sulla length
proprietà dell'array. Non c'è quasi nessuna buona ragione a cui posso pensare di farlo.
angular.equals
quando il terzo argomento assume un valore booleano ?