Встановлення objectEquality
параметра (третього параметра) $watch
функції, безумовно, є правильним способом перегляду ВСІХ властивостей масиву.
$scope.$watch('columns', function(newVal) {
alert('columns changed');
},true); // <- Right here
Пиран відповідає на це досить добре і згадує $watchCollection
також.
Детальніше
Причиною, на яку я відповідаю на вже відповів, є те, що я хочу зазначити, що відповідь wizardwerdna не є хорошою і не повинна використовуватися.
Проблема в тому, що дайджести відбуваються не відразу. Їм доводиться чекати, поки поточний блок коду не завершиться перед виконанням. Таким чином, перегляд length
масиву може насправді пропустити деякі важливі зміни, які $watchCollection
підуть.
Припустимо цю конфігурацію:
$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');
});
На перший погляд може здатися, що вони в той же час будуть стріляти, як, наприклад, у цьому випадку:
function pushToArray() {
$scope.testArray.push({val:3});
}
pushToArray();
// Console output
// length changed: 2 -> 3
// testArray changed
Це працює досить добре, але врахуйте це:
function spliceArray() {
// Starting at index 1, remove 1 item, then push {val: 3}.
$testArray.splice(1, 1, {val: 3});
}
spliceArray();
// Console output
// testArray changed
Зауважте, що отримана довжина була однаковою, навіть якщо масив має новий елемент і втратив елемент, так що час, як $watch
це стосується, length
не змінився. $watchCollection
підхопив на це, хоча.
function pushPopArray() {
$testArray.push({val: 3});
$testArray.pop();
}
pushPopArray();
// Console output
// testArray change
Той самий результат відбувається при натисканні і попсі в одному блоці.
Висновок
Для перегляду кожної властивості масиву використовуйте a $watch
на масиві з включеним третім параметром (objectEquality) та встановіть значення true. Так, це дорого, але іноді необхідно.
Щоб спостерігати, коли об’єкт входить / виходить з масиву, використовуйте a $watchCollection
.
НЕ використовуйте a $watch
у length
властивості масиву. Майже немає вагомих причин, з якими я можу це зробити.
angular.equals
коли третій аргумент приймає булеве значення ?