Відповіді:
Починаючи з 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
:
$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
як призначений набір масиву окремих властивостей, щоб слідкувати за змінами. Трохи по-різному вирішувати подібні, але різні проблеми. Фу!
$watch
Перший параметр також може бути функцією.
$scope.$watch(function watchBothItems() {
return itemsCombinedValue();
}, function whenItemsChange() {
//stuff
});
Якщо ваші два комбіновані значення прості, перший параметр - це просто кутове вираження, як правило. Наприклад, firstName та lastName:
$scope.$watch('firstName + lastName', function() {
//stuff
});
fullName = firstName + " " + lastName
вимагає передачі функції в якості першого аргументу (а не простого виразу, як 'firstName, lastName'
). Кутовий настільки потужний, але є деякі сфери, де це може бути набагато більш зручним для розробників способами, які не (здаються) компрометують продуктивність або принципи дизайну.
$scope.$watch('firstName + lastName', function() {...})
. Ви можете просто зробити два годинник: function nameChanged() {}; $scope.$watch('firstName', nameChanged); $scope.$watch('lastName', nameChanged);
. Я відповів простим випадком до відповіді.
Ось рішення, дуже схоже на ваш оригінальний псевдо-код, який насправді працює:
$scope.$watch('[item1, item2] | json', function () { });
EDIT: Гаразд, я думаю, це ще краще:
$scope.$watch('[item1, item2]', function () { }, true);
В основному ми пропускаємо крок json, який, здавалося, почав робитись німим, але без нього не вийшло. Ключовим моментом є часто опущений 3-й параметр, який вмикає рівність об'єкта на відміну від еталонної рівності. Тоді порівняння між створеними нами об’єктами масиву насправді працюють правильно.
TypeError: Object #<Object> has no method '$watchCollection'
але це рішення допомагає мені вирішити свою проблему!
$scope.$watch('[chaptercontent.Id, anchorid]', function (newValues, oldValues) { ... }, true);
Ви можете використовувати функції в $ 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
? Хіба сфера не переноситься на функції, не чітко визначаючи її?
Чому б просто не загорнути його в forEach
?
angular.forEach(['a', 'b', 'c'], function (key) {
scope.$watch(key, function (v) {
changed();
});
});
Це приблизно такий самий накладні витрати, як надання функції для комбінованого значення, без насправді турбуватися про склад значення .
changed()
викликається, коли щось змінюється в будь-якому з властивостей. Це точно така ж поведінка, як якщо б була надана функція для комбінованого значення.
Трохи безпечнішим рішенням для об'єднання значень може бути використання в якості своєї $watch
функції наступного :
function() { return angular.toJson([item1, item2]) }
або
$scope.$watch(
function() {
return angular.toJson([item1, item2]);
},
function() {
// Stuff to do after either value changes
});
Перший параметр $ watch може бути кутовим виразом або функцією. Дивіться документацію про $ range. $ Watch . Він містить багато корисної інформації про те, як працює метод $ watch: коли виклик watchExpression, як кутовий порівняння результатів тощо.
як щодо:
scope.$watch(function() {
return {
a: thing-one,
b: thing-two,
c: red-fish,
d: blue-fish
};
}, listener...);
true
параметра до scope.$watch
(як у вашому прикладі), listener()
він запускатиметься кожного разу, оскільки анонімний хеш має кожен раз різні посилання.
return { a: functionA(), b: functionB(), ... }
. Потім я перевіряю повернені об'єкти нових і старих значень один проти одного.
$scope.$watch('age + name', function () {
//called when name or age changed
});
Тут функція буде викликана, коли зміниться і вік, і значення імені.
Кутовий, представлений $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]);
});