2013-06-17 13 views
5

Denetleyicimde $ scope.foo var. $ Scope.foo.bar ve $ scope.foo.baz'daki değişiklikleri izlemek ve $ scope.foo nesnesindeki tüm verileri değiştirmek ve değiştirmek için yapmak istiyorum. Bu değişiklikten önce, $ scope.foo verilerini eski $ scope.foo.bar ve $ scope.foo.baz ile sunucuya göndermek istiyorum.

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

Bunu yapmak için nasıl giderim? TIA

cevap

15

$scope.$watch'un ikinci parametresi, iki parametre alan bir işlevdir: ilki, yeni değer, diğeri eski değerdir.

Tüm foo nesnesini izlemek ve $scope.$watch'un üçüncü parametresini true'a ayarlamak için referans yerine eşitlik için nesneyi karşılaştırmak üzere ayarlayabilirsiniz.

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

Yanıt için teşekkürler. İkinci örneğiniz (sendAndReplace()) ayrıca $ scope.foo'daki eski özellikleri koruyor mu? – cp3

+0

Anladım! Teşekkür ederim! – cp3

2

dinleyici işlevini size $ 'a sağlar:

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

ayrı olarak da foo.bar ve foo.baz izleyebilirsiniz: nesneye gerçekten büyükse bu oldukça kötü bir fikir olabilir dikkat edin watch işlevi, burada dokümanlar bölümünde açıklandığı gibi newValue ve oldValue parametrelerinin iki parametresine sahiptir: http://docs.angularjs.org/api/ng.$rootScope.Scope#$watch

Örneğinizde, ayrıştırmak için birleştirilmiş dizeyi izleyin. YeniDeğerlerdeki eskiDeğerler, iki değişken arasında bir ayırıcı koymak zorundasınız: