Есть ли способ подписаться на события на нескольких объектах, используя $watch
Например
$scope.$watch('item1, item2', function () { });
Есть ли способ подписаться на события на нескольких объектах, используя $watch
Например
$scope.$watch('item1, item2', function () { });
Начиная с AngularJS 1.3, появился новый метод $watchGroup
для наблюдения за набором выражений.
$scope.foo = 'foo';
$scope.bar = 'bar';
$scope.$watchGroup(['foo', 'bar'], function(newValues, oldValues, scope) {
// newValues array contains the current values of the watch expressions
// with the indexes matching those of the watchExpression array
// i.e.
// newValues[0] -> $scope.foo
// and
// newValues[1] -> $scope.bar
});
$scope.$watchGroup(['mycustomctrl.foo', 'mycustomctrl.bar'],...
newValues
иoldValues
какundefined
, а индивидуальный просмотр свойств работает как обычно.Начиная с AngularJS 1.1.4 вы можете использовать
$watchCollection
:Пример плунжера здесь
Документация здесь
источник
$watchCollection
, предназначено для передачи объекта и обеспечения отслеживания изменений любых свойств объекта, в то время$watchGroup
как предназначено для передачи массива отдельных свойств для отслеживания изменений. Немного отличается, чтобы решать похожие, но разные проблемы. Уф!$watch
Первый параметр также может быть функцией.Если ваши два объединенных значения просты, первый параметр обычно является угловым выражением. Например, firstName и lastName:
источник
fullName = firstName + " " + lastName
требует передачи функции в качестве первого аргумента (а не простого выражения типа'firstName, lastName'
). Angular настолько мощен, но есть некоторые области, где он может быть гораздо более дружественным к разработчикам способами, которые (как представляется) не ставят под угрозу производительность или принципы проектирования.$scope.$watch('firstName + lastName', function() {...})
. Вы можете просто сделать два часы:function nameChanged() {}; $scope.$watch('firstName', nameChanged); $scope.$watch('lastName', nameChanged);
. Я добавил простой случай к ответу.Вот решение, очень похожее на ваш оригинальный псевдокод, который действительно работает:
РЕДАКТИРОВАТЬ: Хорошо, я думаю, что это даже лучше:
По сути, мы пропускаем шаг json, который казался глупым с самого начала, но без этого он не работал. Их ключ - часто пропускаемый 3-й параметр, который включает равенство объектов, а не равенство ссылок. Тогда сравнения между нашими созданными объектами массива действительно работают правильно.
источник
TypeError: Object #<Object> has no method '$watchCollection'
но это решение помогает мне решить мою проблему!$scope.$watch('[chaptercontent.Id, anchorid]', function (newValues, oldValues) { ... }, true);
Вы можете использовать функции в $ watchGroup для выбора полей объекта в области видимости.
источник
_this
? Разве область не распространяется на функции без явного ее определения?Почему бы просто не обернуть его в
forEach
?Это примерно такая же нагрузка, как и предоставление функции для объединенного значения, без необходимости беспокоиться о составе значения .
источник
changed()
вызывается всякий раз, когда что-то изменяется в любом из свойств. Это точно такое же поведение, как если бы была предоставлена функция для комбинированного значения.Несколько более безопасным решением для объединения значений может быть использование следующего в качестве вашей
$watch
функции:или
источник
Параметр $ watch first может быть угловым выражением или функцией. Смотрите документацию по $ scope. $ Watch . Он содержит много полезной информации о том, как работает метод $ watch: когда вызывается watchExpression, как angular сравнивает результаты и т. Д.
источник
как насчет:
источник
true
параметра toscope.$watch
(как в вашем примере) онlistener()
будет срабатывать каждый раз, потому что анонимный хэш имеет разную ссылку каждый раз.return { a: functionA(), b: functionB(), ... }
. Затем я проверяю возвращенные объекты новых и старых значений друг против друга.Здесь функция будет вызываться при изменении значения возраста и имени.
источник
Angular, представленный
$watchGroup
в версии 1.3, с помощью которого мы можем наблюдать несколько переменных, причем один$watchGroup
блок$watchGroup
принимает массив в качестве первого параметра, в который мы можем включить все наши переменные для просмотра.источник