AngularJS $ scope.$ watch $ scope.foo的属性,但在更改之前将旧值发送到服务器

cp3*_*cp3 5 watch angularjs

我的控制器中有一个对象$ scope.foo.我想监视$ scope.foo.bar和$ scope.foo.baz中的任何更改并执行get请求并替换$ scope.foo对象中的所有数据.在发生此更改之前,我想将$ scope.foo的数据发送到具有旧$ scope.foo.bar和$ 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
});
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?TIA

Bla*_*ole 15

$ scope.$ watch的第二个参数是一个接收两个参数的函数:第一个是新值,第二个是旧值.

你可以简单地观看整个foo对象,设置的第三个参数$范围.$观赏true以比较对象的平等,而不是供参考.请注意,如果您的对象非常大,这可能是一个非常糟糕的主意:

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

您还可以单独观看foo.barfoo.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);
});
Run Code Online (Sandbox Code Playgroud)