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