javascript title - Guarda più attributi $ scope




attribute html (10)

$watch primo parametro $watch può anche essere una funzione.

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

Se i due valori combinati sono semplici, il primo parametro è normalmente un'espressione angolare. Ad esempio, firstName e lastName:

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

C'è un modo per iscriversi agli eventi su più oggetti usando $watch

Per esempio

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

Angular ha introdotto $watchGroup nella versione 1.3 usando il quale possiamo guardare più variabili, con un solo blocco $watchGroup prende array come primo parametro in cui possiamo includere tutte le nostre variabili da guardare.

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

È possibile utilizzare le funzioni in $ watchGroup per selezionare i campi di un oggetto nell'ambito.

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

A partire da AngularJS 1.1.4 è possibile utilizzare $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
});

Esempio di Plunker here

Documentazione here


che ne dite di:

scope.$watch(function() { 
   return { 
      a: thing-one, 
      b: thing-two, 
      c: red-fish, 
      d: blue-fish 
   }; 
}, listener...);

A partire da AngularJS 1.3 c'è un nuovo metodo chiamato $watchGroup per osservare un insieme di espressioni.

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

$ Il primo parametro di watch può essere espressione o funzione angolare . Vedi la documentazione su $scope.$watch . Contiene molte informazioni utili su come funziona il metodo $ watch: quando viene chiamata watchExpression, come vengono confrontati i risultati angolari, ecc.


Perché non semplicemente avvolgerlo in un forEach ?

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

Si tratta dello stesso overhead di fornire una funzione per il valore combinato, senza doversi preoccupare della composizione del valore .


$scope.$watch('age + name', function () {
  //called when name or age changed
});

Qui la funzione verrà chiamata quando vengono modificati sia l'età che il valore del nome.


Ho finito per aggiungere una libreria EventEmitter esterna per proiettare come servizio e iniettarla ovunque mi servisse. Così posso "emettere" e "on" qualsiasi cosa senza curare l'ereditarietà dell'ambito. È meno problemi in questo modo e sicuramente prestazioni migliori. Anche più leggibile per me.

Supporto con caratteri jolly: EventEmitter2

Buona prestazione: eventemitter3

Altra alternativa: Drip





javascript angularjs events angularjs-watch