Das Einstellen des objectEquality
Parameters (dritter Parameter) der $watch
Funktion 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 $watchCollection
auch.
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 length
Array tatsächlich einige wichtige Änderungen übersieht, $watchCollection
die 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 $watch
geht, length
hat sich nicht geändert. $watchCollection
nahm 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 $watch
fü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 $watch
für die length
Eigenschaft des Arrays. Es gibt fast keinen guten Grund, warum ich mir das vorstellen kann.
angular.equals
wenn das dritte Argument einen booleschen Wert annimmt ?