2014-10-15 3 views
1

Я попытался использовать метод $scope.$watchCollection() для массива, который мне нужен, чтобы следить за изменениями, чтобы запустить некоторую фильтрацию. Когда пользователь использует флажки и кнопку для переключения логического значения на один или несколько из этих объектов в заданном массиве, $ watch не запускается надлежащим образом. Однако изменение $watchCollection на $scope.$watch(arr, function(){}, true) с флагом objectEquality, установленным в true, заставляет $ watch работать нормально. Почему $watchCollection не будет автоматически использовать objectEquality, чтобы определить, были ли внесены изменения?

ответ

2

С official documentation из $scope.$watchCollection:

неглубоко часы свойства объекта и пожары, когда любой из свойства изменить (для массивов, это означает, наблюдая элементы массива , для карты объекта, это означает, наблюдая за свойствами). Если обнаружено изменение , выполняется обратный вызов слушателя.

Так для Array он будет выполнять неглубоких часов на товаре Array, что в вашем случае означает, что функция часы будет получить срабатывает, если добавить или удалить элементы из Array. Если у вас есть Array объектов, Угловой не будет выполнять глубокие $watch на этих объектах.

Как @GregL отметил в комментарии внизу: точка $scope.$watchCollection должна быть в состоянии сделать shallow$watch на Object или Array, так как глубокой $watch гораздо дороже, хотя иногда это необходимо.

Единственное, что я хотел бы добавить к @ GregL Замечаний является то, что очень часто мы забываем, что watchExpression функции $watch (первый параметр) также может быть функция, которая может быть использована для отслеживания изменений очень конкретной части большого числа Object или Array, есть много случаев, когда мы могли бы написать эту функцию вместо использования глубокого $watch, что сделало бы $watch намного более эффективным.

+1

Как я понимаю, весь смысл '$ watchCollection' заключается в том, что он более эффективен, чем выполнение глубоких' $ watch'. Когда вы считаете, что для глубоких часов наиболее дорогостоящий путь - это когда два объекта отличаются друг от друга, но точно равны, и он должен пересекать каждое свойство, вы начинаете понимать, почему глубокие часы настолько дороги и их следует избегать, когда это возможно , Но если вам нужно их использовать, глубокие часы - это лучший способ проверить, изменилось ли что-то в пределах значения области. – GregL

+0

@GregL, если вы в порядке, я добавлю свой комментарий к ответу, и я также добавлю немного больше. – Josep

+0

Отлично, сэр. – GregL

Смежные вопросы