426 votes

De regarder plusieurs $portée des attributs

Est-il possible de s'abonner à des événements sur plusieurs objets à l'aide de $watch

E. g.

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

550voto

Paolo Moretti Points 9519

À partir de AngularJS 1.3 il y a une nouvelle méthode appelée $watchGroup pour l'observation d'un ensemble d'expressions.

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

288voto

Răzvan Panda Points 6800

Début avec AngularJS 1.1.4 vous pouvez utiliser $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 exemple ici

La Documentation ici

117voto

Andy Joslin Points 23231

$watch premier paramètre peut aussi être une fonction.

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

Si vos deux valeurs combinées sont simples, le premier paramètre est juste angulaire de l'expression normalement. Par exemple, firstName et lastName:

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

70voto

Karl Zilles Points 3549

Voici une solution très similaire à l'original de votre pseudo-code qui fonctionne:

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

EDIT: Ok, je pense que c'est encore mieux:

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

Fondamentalement, nous sommes à sauter le json étape, qui semblait stupide pour commencer, mais il ne fonctionnait pas sans elle. Ils clé est souvent omis 3e paramètre qui tourne sur l'objet d'égalité plutôt que de faire référence à l'égalité. Ensuite, les comparaisons entre nos créé tableau d'objets de travail à droite.

12voto

Erik Aigner Points 7182

Pourquoi ne pas simplement de l'envelopper dans un forEach?

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

Il s'agit de la même surcharge comme fournissant une fonction de la valeur totale, sans avoir à vous soucier de la valeur de la composition.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: