La définition du objectEqualityparamètre (troisième paramètre) de la $watchfonction 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 lengthun tableau peut manquer certains changements importants qui se $watchCollectionproduiront.
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 $watchconcern, lengthn'a pas changé. $watchCollectioncependant.
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 $watchsur 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 $watchsur la lengthpropriété du tableau. Il n'y a presque aucune bonne raison de penser à le faire.
angular.equalslorsque le troisième argument prend une valeur booléenne ?