Das Einstellen des objectEqualityParameters (dritter Parameter) der $watchFunktion ist definitiv die richtige Methode, um ALLE Eigenschaften des Arrays zu überwachen.
$scope.$watch('columns', function(newVal) {
alert('columns changed');
},true); // <- Right here
Piran antwortet gut genug und erwähnt es $watchCollectionauch.
Mehr Details
Der Grund, warum ich eine bereits beantwortete Frage beantworte, ist, dass ich darauf hinweisen möchte, dass die Antwort von wizardwerdna nicht gut ist und nicht verwendet werden sollte.
Das Problem ist, dass die Digests nicht sofort stattfinden. Sie müssen warten, bis der aktuelle Codeblock vollständig ist, bevor sie ausgeführt werden. Beobachten Sie daher, wie das lengthArray tatsächlich einige wichtige Änderungen übersieht, $watchCollectiondie abfangen werden.
Nehmen Sie diese Konfiguration an:
$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');
});
Auf den ersten Blick scheint es, als würden diese gleichzeitig feuern, wie in diesem Fall:
function pushToArray() {
$scope.testArray.push({val:3});
}
pushToArray();
// Console output
// length changed: 2 -> 3
// testArray changed
Das funktioniert gut genug, aber bedenken Sie Folgendes:
function spliceArray() {
// Starting at index 1, remove 1 item, then push {val: 3}.
$testArray.splice(1, 1, {val: 3});
}
spliceArray();
// Console output
// testArray changed
Beachten Sie, dass die resultierende Länge war die gleiche , obwohl das Array ein neues Element hat und verloren ein Element, um zusehen , wie das $watchgeht, lengthhat sich nicht geändert. $watchCollectionnahm es jedoch auf.
function pushPopArray() {
$testArray.push({val: 3});
$testArray.pop();
}
pushPopArray();
// Console output
// testArray change
Das gleiche Ergebnis wird mit einem Push and Pop im selben Block erzielt.
Fazit
Um jede Eigenschaft im Array zu überwachen, verwenden Sie a $watchfür das Array selbst, wobei der dritte Parameter (objectEquality) enthalten ist und auf true gesetzt ist. Ja, das ist teuer, aber manchmal notwendig.
Verwenden Sie a, um zu beobachten, wann ein Objekt das Array betritt / verlässt $watchCollection.
Verwenden Sie NICHT a $watchfür die lengthEigenschaft des Arrays. Es gibt fast keinen guten Grund, warum ich mir das vorstellen kann.
angular.equalswenn das dritte Argument einen booleschen Wert annimmt ?