Assista vários atributos do escopo $

Existe uma maneira de se inscrever em events em vários objects usando $watch

Por exemplo

 $scope.$watch('item1, item2', function () { }); 

A partir do AngularJS 1.3, existe um novo método chamado $watchGroup para observar um conjunto de expressões.

 $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 // ie // newValues[0] -> $scope.foo // and // newValues[1] -> $scope.bar }); 

Começando com o AngularJS 1.1.4 você pode usar $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 }); 

Exemplo de Plunker aqui

Documentação aqui

$watch primeiro parâmetro $watch também pode ser uma function.

 $scope.$watch(function watchBothItems() { return itemsCombinedValue(); }, function whenItemsChange() { //stuff }); 

Se seus dois valores combinados forem simples, o primeiro parâmetro é apenas uma expressão angular normalmente. Por exemplo, firstName e lastName:

 $scope.$watch('firstName + lastName', function() { //stuff }); 

Aqui está uma solução muito semelhante ao seu pseudo-código original que realmente funciona:

 $scope.$watch('[item1, item2] | json', function () { }); 

EDIT: Ok, eu acho que isso é ainda melhor:

 $scope.$watch('[item1, item2]', function () { }, true); 

Basicamente, estamos pulando o passo do json, o que para começar parecia burro, mas não estava funcionando sem ele. A chave é o terceiro parâmetro frequentemente omitido que ativa a igualdade de objects em oposição à igualdade de referência. Em seguida, as comparações entre nossos objects de matriz criados funcionam corretamente.

Você pode usar funções em $ watchGroup para selecionar campos de um object no escopo.

  $scope.$watchGroup( [function () { return _this.$scope.ViewModel.Monitor1Scale; }, function () { return _this.$scope.ViewModel.Monitor2Scale; }], function (newVal, oldVal, scope) { if (newVal != oldVal) { _this.updateMonitorScales(); } }); 

Por que não simplesmente envolvê-lo em um forEach ?

 angular.forEach(['a', 'b', 'c'], function (key) { scope.$watch(key, function (v) { changed(); }); }); 

É sobre a mesma sobrecarga que fornecer uma function para o valor combinado, sem ter que se preocupar com a composição do valor .

Uma solução um pouco mais segura para combinar valores pode ser usar o seguinte como sua function $watch :

 function() { return angular.toJson([item1, item2]) } 

ou

 $scope.$watch( function() { return angular.toJson([item1, item2]); }, function() { // Stuff to do after either value changes }); 

$ watch primeiro parâmetro pode ser uma expressão ou function angular . Veja a documentação sobre $ scope. $ Watch . Ele contém muitas informações úteis sobre como o método $ watch funciona: quando watchExpression é chamado, como o angular compara os resultados, etc.

e quanto a:

 scope.$watch(function() { return { a: thing-one, b: thing-two, c: red-fish, d: blue-fish }; }, listener...); 
 $scope.$watch('age + name', function () { //called when name or age changed }); 

Aqui a function será chamada quando a idade e o valor do nome forem alterados.

Angular introduziu o $watchGroup na versão 1.3 usando o qual podemos observar múltiplas variables, com um único bloco $watchGroup toma array como primeiro parâmetro no qual podemos include todas as nossas variables ​​para assistir.

 $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]); });