javascript - bootstrap - html th scope




Beobachten Sie mehrere $ scope-Attribute (8)

$ watch erster Parameter kann ein Winkelausdruck oder eine Funktion sein. Siehe Dokumentation zu $scope.$watch . Es enthält eine Menge nützlicher Informationen darüber, wie die $ watch-Methode funktioniert: Wenn watchExpression aufgerufen wird, wie Winkel Ergebnisse vergleicht usw.

Gibt es eine Möglichkeit, Ereignisse für mehrere Objekte mit $watch zu abonnieren $watch

Z.B

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

Ab AngularJS 1.1.4 können Sie $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 Beispiel here

Dokumentation here


Angular eingeführt $watchGroup in Version 1.3, mit denen wir mehrere Variablen beobachten können, mit einem einzigen $watchGroup Block $watchGroup nimmt Array als erster Parameter, in dem wir alle unsere Variablen einschließen können, zu beobachten.

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

Eine etwas sicherere Lösung zum Kombinieren von Werten könnte darin bestehen, Folgendes als Ihre $watch Funktion zu verwenden:

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

oder

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

Sie können Funktionen in $ watchGroup verwenden, um Felder eines Objekts im Gültigkeitsbereich auszuwählen.

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

Warum nicht einfach in ein forEach ?

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

Es ist ungefähr der gleiche Overhead wie das Bereitstellen einer Funktion für den kombinierten Wert, ohne sich um die Wertezusammensetzung kümmern zu müssen .


$watch first parameter kann auch eine Funktion sein.

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

Wenn Ihre beiden kombinierten Werte einfach sind, ist der erste Parameter normalerweise nur ein Winkelausdruck. Zum Beispiel firstName und lastName:

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

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

Hier wird die Funktion aufgerufen, wenn Alter und Name geändert werden.





angularjs-watch