Есть ли способ подписаться на события нескольких объектов с помощью $watch
E.g.
$scope.$watch('item1, item2', function () { });
Есть ли способ подписаться на события нескольких объектов с помощью $watch
E.g.
$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'],...
- person morels; 15.10.2015
newValues
и oldValues
как undefined
, при этом индивидуально наблюдая, как свойства работают как обычно.
- person Alejandro García Iglesias; 03.04.2017
Начиная с AngularJS 1.1.4 вы можете использовать $watchCollection
:
$scope.$watchCollection('[item1, item2]', function(newValues, oldValues){
// do stuff here
// newValues and oldValues contain the new and respectively old value
// of the observed collection array
});
Пример Plunker здесь
Документация здесь
$watchCollection
предназначен для передачи объекта и наблюдения за изменениями любых свойств объекта, тогда как $watchGroup
предназначен для передачи массива отдельных свойств для отслеживания изменений в . Немного отличается, чтобы решать похожие, но разные проблемы. Уф!
- person Mattygabe; 28.02.2015
$watch
первый параметр также может быть функцией.
$scope.$watch(function watchBothItems() {
return itemsCombinedValue();
}, function whenItemsChange() {
//stuff
});
Если ваши два комбинированных значения просты, первый параметр обычно представляет собой просто угловое выражение. Например, firstName и lastName:
$scope.$watch('firstName + lastName', function() {
//stuff
});
fullName = firstName + " " + lastName
, требует передачи функции в качестве первого аргумента (а не простого выражения, такого как 'firstName, lastName'
). Angular НАСТОЛЬКО мощный инструмент, но есть некоторые области, в которых он может быть намного более удобен для разработчиков, не влияя (кажется) на производительность или принципы проектирования.
- person XML; 25.08.2012
$scope.$watch('firstName + lastName', function() {...})
. Вы также можете просто сделать две часы: function nameChanged() {}; $scope.$watch('firstName', nameChanged); $scope.$watch('lastName', nameChanged);
. Я добавил к ответу простой случай.
- person Andrew Joslin; 25.08.2012
Вот решение, очень похожее на ваш исходный псевдокод, который действительно работает:
$scope.$watch('[item1, item2] | json', function () { });
РЕДАКТИРОВАТЬ: Хорошо, я думаю, это даже лучше:
$scope.$watch('[item1, item2]', function () { }, true);
По сути, мы пропускаем этап json, который изначально казался глупым, но без него он не работал. Ключевым моментом является часто опускаемый третий параметр, который включает равенство объектов, а не равенство ссылок. Тогда сравнения между нашими созданными объектами массива действительно работают правильно.
TypeError: Object #<Object> has no method '$watchCollection'
, но это решение помогает мне решить мою проблему!
- person abottoni; 10.09.2013
$scope.$watch('[chaptercontent.Id, anchorid]', function (newValues, oldValues) { ... }, true);
- person Serge van den Oever; 28.01.2014
Вы можете использовать функции в $ watchGroup для выбора полей объекта в области видимости.
$scope.$watchGroup(
[function () { return _this.$scope.ViewModel.Monitor1Scale; },
function () { return _this.$scope.ViewModel.Monitor2Scale; }],
function (newVal, oldVal, scope)
{
if (newVal != oldVal) {
_this.updateMonitorScales();
}
});
_this
? Разве область видимости не переносится в функции без ее явного определения?
- person sg.cc; 21.05.2015
Почему бы просто не обернуть его forEach
?
angular.forEach(['a', 'b', 'c'], function (key) {
scope.$watch(key, function (v) {
changed();
});
});
Это примерно такие же накладные расходы, как и предоставление функции для комбинированного значения, без необходимости беспокоиться о составе значений.
changed()
вызывается всякий раз, когда что-то изменяется в любом из свойств. Это точно такое же поведение, как если бы была предоставлена функция для комбинированного значения.
- person Erik Aigner; 13.05.2013
changed()
будет вызываться три раза. С чем-то вроде $watchGroup
(или написанием функции, которая объединяет разные значения в ключ), это будет вызываться только один раз.
- person binki; 29.06.2018
Несколько более безопасным решением для объединения значений может быть использование следующей функции в качестве $watch
:
function() { return angular.toJson([item1, item2]) }
or
$scope.$watch(
function() {
return angular.toJson([item1, item2]);
},
function() {
// Stuff to do after either value changes
});
Первый параметр $ watch может быть угловым выражением или функцией. См. Документацию по $ scope. $ Watch. Он содержит много полезной информации о том, как работает метод $ watch: когда вызывается watchExpression, как angular сравнивает результаты и т. Д.
как насчет:
scope.$watch(function() {
return {
a: thing-one,
b: thing-two,
c: red-fish,
d: blue-fish
};
}, listener...);
true
до scope.$watch
(как в вашем примере) listener()
будет срабатывать каждый раз, потому что анонимный хэш каждый раз имеет другую ссылку.
- person Peter V. Mørch; 27.01.2014
return { a: functionA(), b: functionB(), ... }
. Затем я сравниваю возвращенные объекты нового и старого значений друг с другом.
- person RevNoah; 18.03.2014
$scope.$watch('age + name', function () {
//called when name or age changed
});
Здесь функция будет вызываться при изменении значения возраста и имени.
Angular представил $watchGroup
в версии 1.3, с помощью которого мы можем наблюдать за несколькими переменными, с одним блоком $watchGroup
, $watchGroup
принимает массив в качестве первого параметра, в который мы можем включить все наши переменные для наблюдения.
$scope.$watchGroup(['var1','var2'],function(newVals,oldVals){
console.log("new value of var1 = " newVals[0]);
console.log("new value of var2 = " newVals[1]);
console.log("old value of var1 = " oldVals[0]);
console.log("old value of var2 = " oldVals[1]);
});