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

时间:2013-06-17 18:40:26

标签: angularjs watch

我的控制器中有一个对象$ 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
});

我该怎么做呢? TIA

2 个答案:

答案 0 :(得分:15)

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

您可以简单地查看整个foo对象,并将$scope.$watch的第三个参数设置为true,以便比较对象是否相等而不是参考。请注意,如果您的对象非常大,这可能是一个非常糟糕的主意:

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

您还可以单独观看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);
});

答案 1 :(得分:2)

您提供给$ watch函数的侦听器函数有两个参数newValue和oldValue,如文档中所述:http://docs.angularjs.org/api/ng.$rootScope.Scope#$watch

在你的例子中,你观察连接的字符串,所以要从newValues解析oldValues,你必须在两个变量之间放置一个分隔符,如下所示:

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