是否可以在服务中的对象数组上设置$watch
(我希望$watch
声明本身在服务中?)
答案 0 :(得分:121)
您可以通过注入$rootScope
并使用函数作为$watch
方法的第一个参数,将任何表达式添加到监视集。伪代码:
$rootScope.$watch(function() {
return //value to be watched;
}, function watchCallback(newValue, oldValue) {
//react on value change here
});
不要忘记$watch
方法的第三个布尔参数。如果要深度观察整个对象以进行更改,则需要指定true
。
答案 1 :(得分:15)
服务本质上就像是班级和家庭方法。您可以设置一个从控制器调用的方法,该方法的参数是范围并应用监视表达式:
app.service('myservice',function(){
this.listen = function($scope) {
$scope.$watch(function(){return someScopeValue},function(){
//$scope.dosomestuff();
});
}
});
//your controller
function myCtrl($scope,myservice) {
$scope.listen = function() {
myservice.listen($scope);
}
//call your method
$scope.listen();
}
更新:如果您尝试在服务中查看私有局部变量,请使用$ rootScope查看接受的答案。如果你试图在本地范围内观察一个$ scope变量而不是上面的最佳选择。他们正在完成两件截然不同的事情。
答案 2 :(得分:0)
你能澄清一下你想要达到的目标吗?据我所知,您将从服务器获取一组对象作为您的模型。然后不清楚:
在第一种情况下,你并不需要使用$ watch(或者更确切地说是$ watchCollection),但你应该遍历从服务器收到的数组并验证更改(与watchColleciton会做的相同)。如果对象与您当前持有的对象不同 - 您可以在此元素上调用object。$ save()。
在第2种情况下,在$ scope上使用$ watchCollection()作为参数传递给服务函数,或者如果你在$ rootScope中保存数组,则使用$ rootScope。
如果您要澄清方案,我可以为您提供真实的代码。
答案 3 :(得分:0)
嘿,我刚刚在两个不同的控制器上安装了一个非常大的手表。
因为我不想复制我刚刚定义的任何代码以在我的服务中运行:
angular
.module('invoice')
.factory('invoiceState', function () {
var invoice = {
client_info: {
lastname: "",
firstname: "",
email: "",
phone: "",
id_client: "",
...
}
}
invoice.watchAccommodation = function (newVal, oldVal) {
var accommodation = newVal;
//Whatever you would normally have in your watch function
}
然后我可以在我注入服务的任何控制器的监视中调用此函数
function NewInvoiceCtrl(invoiceState) {
$scope.$watch('invoice.accommodation',invoiceState.watchAccommodation, true);
}
我对AngularJS没有太多经验,所以我不能真正深入研究这种方法的性能方面,但它有效;)