457 Stimmen

Mehrere $scope-Attribute beobachten

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

z.B.

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

603voto

Paolo Moretti Punkte 50959

Ab AngularJS 1.3 gibt es eine neue Methode namens $watchGroup zur Beobachtung einer Reihe von Ausdrücken.

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

292voto

Beginnend mit 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
});

Beispiel Plunker aquí

Dokumentation aquí

118voto

Andrew Joslin Punkte 42973

$watch Der erste 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, Vorname und Nachname:

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

72voto

Karen Zilles Punkte 7633

Hier ist eine Lösung, die Ihrem ursprünglichen Pseudocode sehr ähnlich ist und tatsächlich funktioniert:

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

EDITAR: Okay, ich denke, das ist sogar noch besser:

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

Im Grunde überspringen wir den json-Schritt, was anfangs dumm erschien, aber ohne ihn funktionierte es nicht. Der Schlüssel ist der oft ausgelassene 3. Parameter, der die Objektgleichheit im Gegensatz zur Referenzgleichheit aktiviert. Dann funktionieren die Vergleiche zwischen unseren erstellten Array-Objekten tatsächlich richtig.

15voto

Yang Zhang Punkte 4380

Sie können Funktionen in $watchGroup verwenden, um Felder eines Objekts im Geltungsbereich 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();
             }
         });

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X