2013-06-17 6 views
5

Mam obiekt $ scope.foo w moim kontrolerze. Chcę obejrzeć zmiany w $ scope.foo.bar i $ scope.foo.baz i wykonać polecenie pobrania i zamienić wszystkie dane w obiekcie $ scope.foo. Zanim dojdzie do tej zmiany, chciałbym wysłać dane serwera $ scope.foo na serwer ze starymi $ scope.foo.bar i $ scope.foo.baz.

$scope.$watch('foo.bar + form.baz', function() { 
    // send old $scope.foo to server with the 
    // previous $scope.foo.bar and $scope.foo.baz 
}); 

Jak mam to zrobić? TIA

Odpowiedz

15

Drugi parametr $scope.$watch to funkcja, która otrzymuje dwa parametry: pierwszy to nowa wartość, a druga stara wartość.

Możesz po prostu obejrzeć cały obiekt foo i ustawić trzeci parametr $scope.$watch na true, aby porównać obiekt dla równości, a nie dla odniesienia. Zauważ, że to może być całkiem dobrym pomysłem, jeśli obiekt jest naprawdę duży:

$scope.$watch(
    'foo', 
    function (newFoo, oldFoo) { 
     // send old $scope.foo to server with the 
     // previous $scope.foo.bar and $scope.foo.baz 
    }, 
    true 
); 

Można również oglądać oddzielnie foo.bar i foo.baz:

var sendAndReplace = function (parameterName, oldParameter) { 
    oldFoo = angular.copy($scope.foo); 
    oldFoo[parameterName] = oldParameter; 

    // send old oldFoo to server with the 
    // previous oldFoo.bar oldFoo.baz 
}; 

$scope.$watch('foo.bar', function (newValue, oldValue)) { 
    sendAndReplace('bar', oldValue); 
}); 

$scope.$watch('foo.baz', function (newValue, oldValue)) { 
    sendAndReplace('baz', oldValue); 
}); 
+0

Dzięki za odpowiedź. Czy twój drugi przykład (sendAndReplace()) również zachowuje stare właściwości na $ scope.foo? – cp3

+0

Gotowy! Dziękuję Ci! – cp3

2

funkcja detektora, które można dostarczyć do $ funkcja watch ma dwa parametry newValue i oldValue opisane w dokumentacji tutaj: http://docs.angularjs.org/api/ng.$rootScope.Scope#$watch

W twoim przykładzie oglądasz na połączonym łańcuchu, tak aby parsować oldValues ​​od newValues ​​musisz umieścić separator między dwiema zmiennymi takimi jak:

$scope.$watch('foo.bar + ";" + foo.baz', function(newValue, oldValue) { 
     var oldValues = oldValue.split(";"); 
     var oldBar = oldValues[0]; 
     var oldBaz = oldValues[1]; 
     console.log("oldBar="+oldBar); 
     console.log("oldBaz="+oldBaz); 
    }); 
Powiązane problemy