Ustawienie objectEquality
parametru (trzeciego parametru) $watch
funkcji jest zdecydowanie poprawnym sposobem oglądania WSZYSTKICH właściwości tablicy.
$scope.$watch('columns', function(newVal) {
alert('columns changed');
},true); // <- Right here
Piran odpowiada na to wystarczająco dobrze i również wspomina $watchCollection
.
Więcej szczegółów
Powodem, dla którego odpowiadam na pytanie, na które już udzielono odpowiedzi, jest to, że chcę podkreślić, że odpowiedź wizardwerdna nie jest dobra i nie należy jej używać.
Problem polega na tym, że trawienia nie następują natychmiast. Muszą poczekać na zakończenie bieżącego bloku kodu przed wykonaniem. Dlatego obserwuj length
tablicę, która może faktycznie przegapić kilka ważnych zmian, które $watchCollection
zostaną przechwycone.
Załóż tę konfigurację:
$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');
});
Na pierwszy rzut oka może się wydawać, że strzelałyby jednocześnie, tak jak w tym przypadku:
function pushToArray() {
$scope.testArray.push({val:3});
}
pushToArray();
// Console output
// length changed: 2 -> 3
// testArray changed
To działa wystarczająco dobrze, ale rozważ to:
function spliceArray() {
// Starting at index 1, remove 1 item, then push {val: 3}.
$testArray.splice(1, 1, {val: 3});
}
spliceArray();
// Console output
// testArray changed
Zauważ, że wynikowa długość była taka sama, mimo że tablica ma nowy element i straciła element, więc jeśli chodzi o obserwację $watch
, length
nie zmieniła się. $watchCollection
jednak to zrozumiałam.
function pushPopArray() {
$testArray.push({val: 3});
$testArray.pop();
}
pushPopArray();
// Console output
// testArray change
Ten sam rezultat dzieje się z naciśnięciem i popem w tym samym bloku.
Wniosek
Aby obejrzeć każdą właściwość w tablicy, użyj $watch
samej tablicy z trzecim parametrem (objectEquality) zawartym i ustawionym na true. Tak, jest to drogie, ale czasem konieczne.
Aby obserwować, kiedy obiekt wchodzi / wychodzi z tablicy, użyj $watchCollection
.
NIE używaj a $watch
we length
właściwości tablicy. Nie ma prawie żadnego dobrego powodu, aby to zrobić.
angular.equals
gdy trzeci argument przyjmuje wartość logiczną ?