La définition du objectEquality
paramètre (troisième paramètre) de la $watch
fonction est certainement la bonne façon de regarder TOUTES les propriétés du tableau.
$scope.$watch('columns', function(newVal) {
alert('columns changed');
},true); // <- Right here
Piran répond assez bien à cette question et mentionne $watchCollection
également.
Plus de détails
La raison pour laquelle je réponds à une question déjà répondue est parce que je veux souligner que la réponse de wizardwerdna n'est pas bonne et ne doit pas être utilisée.
Le problème est que les résumés ne se font pas immédiatement. Ils doivent attendre la fin du bloc de code actuel avant de s'exécuter. Ainsi, regarder length
un tableau peut manquer certains changements importants qui se $watchCollection
produiront.
Supposons cette configuration:
$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');
});
À première vue, il peut sembler que ceux-ci se déclencheraient en même temps, comme dans ce cas:
function pushToArray() {
$scope.testArray.push({val:3});
}
pushToArray();
// Console output
// length changed: 2 -> 3
// testArray changed
Cela fonctionne assez bien, mais considérez ceci:
function spliceArray() {
// Starting at index 1, remove 1 item, then push {val: 3}.
$testArray.splice(1, 1, {val: 3});
}
spliceArray();
// Console output
// testArray changed
Notez que la longueur résultante était la même, même si le tableau a un nouvel élément et a perdu un élément, de sorte que watch as the $watch
concern, length
n'a pas changé. $watchCollection
cependant.
function pushPopArray() {
$testArray.push({val: 3});
$testArray.pop();
}
pushPopArray();
// Console output
// testArray change
Le même résultat se produit avec un push and pop dans le même bloc.
Conclusion
Pour surveiller chaque propriété du tableau, utilisez un $watch
sur le tableau lui-même avec le troisième paramètre (objectEquality) inclus et défini sur true. Oui, c'est cher mais parfois nécessaire.
Pour regarder quand un objet entre / sort du tableau, utilisez a $watchCollection
.
N'utilisez PAS a $watch
sur la length
propriété du tableau. Il n'y a presque aucune bonne raison de penser à le faire.
angular.equals
lorsque le troisième argument prend une valeur booléenne ?