5

我的控制器中有一个对象 $scope.foo 。我想观察 $scope.foo.bar 和 $scope.foo.baz 中的任何变化,并执行获取请求并替换 $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

4

2 回答 2

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.bar观看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);
});
于 2013-06-17T18:56:35.580 回答
2

您提供给 $watch 函数的侦听器函数有两个参数 newValue 和 oldValue ,如下面的文档中所述:http://docs.angularjs.org/api/ng.$ro​​otScope.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);
    });
于 2013-06-17T18:58:49.830 回答