Установка 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
Тот же результат происходит с толчком и поп в одном блоке.
Вывод
Чтобы просмотреть каждое свойство в массиве, используйте $watch
саму себя в массиве с включенным третьим параметром (objectEquality) и значением true. Да, это дорого, но иногда необходимо.
Чтобы посмотреть, когда объект входит / выходит из массива, используйте $watchCollection
.
НЕ используйте свойство $watch
on length
массива. У меня почти нет веских причин для этого.
angular.equals
когда третий аргумент принимает логическое значение ?