Question Regarder plusieurs attributs $ scope


Est-il possible de s’abonner à des événements sur plusieurs objets en utilisant $watch

Par exemple.

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

423
2017-08-14 12:49


origine


Réponses:


À partir de AngularJS 1.3, il existe une nouvelle méthode appelée $watchGroup pour observer 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 
});

546
2018-05-06 12:51



En commençant par 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
});

Exemple Plunker ici

Documentation ici


286
2018-06-20 22:25



$watch Le premier paramètre peut également ê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 une expression angulaire normalement. Par exemple, prénom et nom:

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

117
2017-08-14 13:04



Voici une solution très similaire à votre pseudo-code original qui fonctionne réellement:

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

MODIFIER: D'accord, je pense que c'est encore mieux:

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

Fondamentalement, nous sautons l'étape JSON, qui semblait stupide pour commencer, mais cela ne fonctionnait pas sans elle. They key est le troisième paramètre souvent omis qui active l'égalité d'objet par opposition à l'égalité de référence. Ensuite, les comparaisons entre nos objets de tableau créés fonctionnent correctement.


70
2018-01-19 01:05



Pourquoi ne pas simplement envelopper dans un forEach?

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

C'est à peu près le même overhead que fournir une fonction pour la valeur combinée, sans avoir à s'inquiéter de la composition de la valeur.


12
2018-05-12 14:31



Vous pouvez utiliser les fonctions de $ watchGroup pour sélectionner des champs d'un objet dans la portée.

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

12
2018-05-20 23:57



Une solution légèrement plus sûre pour combiner les valeurs pourrait être d'utiliser ce qui suit comme $watch fonction:

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

ou

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

10
2017-10-02 08:16



$ watch premier paramètre peut être expression angulaire ou fonction. Voir la documentation sur $ scope. $ watch. Il contient beaucoup d'informations utiles sur le fonctionnement de la méthode $ watch: quand watchExpression est appelée, comment angulaire compare les résultats, etc.


5
2017-08-14 13:35