В моей области есть массив объектов, я хочу посмотреть все значения каждого объекта.
Это мой код:
function TodoCtrl($scope) {
$scope.columns = [
{ field:'title', displayName: 'TITLE'},
{ field: 'content', displayName: 'CONTENT' }
];
$scope.$watch('columns', function(newVal) {
alert('columns changed');
});
}
Но когда я изменяю значения, например, я изменяю TITLE
на TITLE2
, alert('columns changed')
никогда не появлялось.
Как глубоко наблюдать за объектами внутри массива?
Существует живая демонстрация: http://jsfiddle.net/SYx9b/
angular.equals
когда третий аргумент принимает логическое значение ?$watchCollection
$watchCollection
будет смотреть только «первый уровень» массива или объекта, насколько я понимаю. Приведенный выше ответ является правильным, если вам нужно смотреть глубже, чем это. bennadel.com/blog/…Есть глубокие последствия для глубокого погружения объекта в ваши часы. Иногда (например, когда изменения представляют собой только нажатия и всплески), вы можете захотеть посмотреть $ легко вычисляемое значение, такое как array.length.
источник
Если вы собираетесь просматривать только один массив, вы можете просто использовать этот фрагмент кода:
пример
Но это не будет работать с несколькими массивами:
пример
Чтобы справиться с этой ситуацией, я обычно конвертирую несколько массивов, которые хочу просмотреть, в JSON:
пример
Как отметил @jssebastian в комментариях,
JSON.stringify
может быть предпочтительнее,angular.toJson
поскольку он может обрабатывать элементы, начинающиеся с '$', а также возможные другие случаи.источник
$watch
, может ли он сделать то же самое?Pass true as a third argument to watch an object's properties too.
См: cheatography.com/proloser/cheat-sheets/angularjsangular.toJson
в одном массиве.Стоит отметить, что в Angular 1.1.x и выше теперь вы можете использовать $ watchCollection вместо $ watch. Хотя $ watchCollection, кажется, создает неглубокие часы, поэтому он не будет работать с массивами объектов, как вы ожидаете. Он может обнаруживать добавления и удаления в массиве, но не свойства объектов внутри массивов.
источник
Вот сравнение трех способов просмотра переменной области с примерами:
$ watch () запускается:
$ watchCollection () запускается всем, что находится выше AND:
$ watch (..., true) вызывается ВСЕМ выше И:
ТОЛЬКО ОДИН БОЛЬШЕ ...
$ Часы () является единственным, который срабатывает, когда массив заменяется другим массивом, даже если этот другой массив имеет точно такое же содержимое.
Например, где
$watch()
будет стрелять и$watchCollection()
не будетНиже приведена ссылка на пример JSFiddle, который использует все различные комбинации часов и выводит сообщения журнала, чтобы указать, какие «часы» были запущены:
http://jsfiddle.net/luisperezphd/2zj9k872/
источник
$ watchCollection выполняет то, что вы хотите сделать. Ниже приведен пример, скопированный с веб-сайта angularjs http://docs.angularjs.org/api/ng/type/$rootScope.Scope. Хотя это удобно, необходимо учитывать производительность, особенно при просмотре большой коллекции.
источник
Это решение сработало очень хорошо для меня, я делаю это в директиве:
scope. $ watch (attrs.testWatch, function () {.....}, true);
истина работает довольно хорошо и реагирует на все изменения (добавление, удаление или изменение поля).
Вот рабочий поршень для игры с ним.
Глубоко наблюдая за массивом в AngularJS
Я надеюсь, что это может быть полезно для вас. Если у вас есть какие-либо вопросы, не стесняйтесь спрашивать, я постараюсь помочь :)
источник
В моем случае мне нужно было наблюдать службу, которая содержит объект адреса, также наблюдаемый несколькими другими контроллерами. Я застрял в цикле, пока не добавил параметр «true», который, кажется, является ключом к успеху при просмотре объектов.
источник
Установка
objectEquality
параметра (третьего параметра)$watch
функции, безусловно, является правильным способом просмотра ВСЕХ свойств массива.Пиран отвечает на это достаточно хорошо и упоминает
$watchCollection
также.Более детально
Причина, по которой я отвечаю на уже отвеченный вопрос, состоит в том, что я хочу указать, что ответ wizardwerdna не является хорошим и не должен использоваться.
Проблема в том, что дайджесты не происходят сразу. Они должны дождаться завершения текущего блока кода, прежде чем выполнять. Таким образом, просмотр
length
массива может фактически пропустить некоторые важные изменения,$watchCollection
которые выловят.Предположим, эта конфигурация:
На первый взгляд может показаться, что они сработают одновременно, например, в этом случае:
Это работает достаточно хорошо, но учтите это:
Обратите внимание, что результирующая длина была одинаковой, даже если у массива есть новый элемент и он потерял элемент, так что наблюдайте, как
$watch
этоlength
не изменилось.$watchCollection
взял на себя, хотя.Тот же результат происходит с толчком и поп в одном блоке.
Вывод
Чтобы просмотреть каждое свойство в массиве, используйте
$watch
саму себя в массиве с включенным третьим параметром (objectEquality) и значением true. Да, это дорого, но иногда необходимо.Чтобы посмотреть, когда объект входит / выходит из массива, используйте
$watchCollection
.НЕ используйте свойство
$watch
onlength
массива. У меня почти нет веских причин для этого.источник
источник