Я попытался использовать метод $scope.$watchCollection()
для массива, который мне нужен, чтобы следить за изменениями, чтобы запустить некоторую фильтрацию. Когда пользователь использует флажки и кнопку для переключения логического значения на один или несколько из этих объектов в заданном массиве, $ watch не запускается надлежащим образом. Однако изменение $watchCollection
на $scope.$watch(arr, function(){}, true)
с флагом objectEquality, установленным в true, заставляет $ watch работать нормально. Почему $watchCollection
не будет автоматически использовать objectEquality, чтобы определить, были ли внесены изменения?
ответ
С 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. angularJS почему $ scope. $ Watch не работает?
- 2. $ scope или scope в $ scope. $ Watch?
- 3. Как работает Angular $ scope. $ Watch?
- 4. Scope переменная, не обновляющаяся в $ scope. $ Watch
- 5. Есть ли у нас недостаток использования $ scope. $ Watch и $ scope. $ WatchCollection?
- 6. $ watch() не обновляет $ scope
- 7. Scope. $ Watch with $ timeout
- 8. $ scope. $ Watch, но только для событий ngChange?
- 9. Угловая путаница $ scope с $ watch
- 10. угловой ui bootstrap, $ scope. $ Watch не работает
- 11. angularjs: $ scope. $ Watch не работает внутри forloop
- 12. scope. $ Watch не работает в угловой директиве
- 13. AngularJs. Цикл в $ scope. $ Watch
- 14. $ scope. $ Watch не работает должным образом
- 15. Angular $ scope. $ Watch newVal! == oldVal
- 16. Angularjs $ scope. $ WatchCollection только свойства первого уровня
- 17. Как использовать $ scope. $ WatchCollection insted of angleular.forEach()
- 18. $ scope. $ Watch не работает должным образом
- 19. Angular, watch $ scope for changes
- 20. AngularJS: Использование $ scope. $ Watch и все еще нужно $ scope. $ Apply?
- 21. AngularJS scope watch не запускается
- 22. Как контролировать $ scope. $ Watch iteration?
- 23. Вызов функции внутри $ scope. $ Watch
- 24. Использование $ scope. $ Watch в ES6
- 25. Почему мой $ scope не работает?
- 26. Директива scope. $ Watch вызвана после функции контроллера
- 27. $ scope. $ Watch not called, но $ digest уже выполняется
- 28. debounce not firing in $ scope. $ Watch
- 29. Переменная класса scope vs scope scope variable
- 30. AngularJS $ scope. $ Watch на свойства объекта
Как я понимаю, весь смысл '$ watchCollection' заключается в том, что он более эффективен, чем выполнение глубоких' $ watch'. Когда вы считаете, что для глубоких часов наиболее дорогостоящий путь - это когда два объекта отличаются друг от друга, но точно равны, и он должен пересекать каждое свойство, вы начинаете понимать, почему глубокие часы настолько дороги и их следует избегать, когда это возможно , Но если вам нужно их использовать, глубокие часы - это лучший способ проверить, изменилось ли что-то в пределах значения области. – GregL
@GregL, если вы в порядке, я добавлю свой комментарий к ответу, и я также добавлю немного больше. – Josep
Отлично, сэр. – GregL