是否可以在服务内的对象数组上设置$watch
(我希望$watch
声明本身位于服务内)?
发布于 2013-07-23 17:52:30
通过注入$rootScope
并将函数作为$watch
方法的第一个参数,可以向监视集添加任何表达式。伪代码:
$rootScope.$watch(function() {
return //value to be watched;
}, function watchCallback(newValue, oldValue) {
//react on value change here
});
不要忘记第三个参数,即$watch
方法的布尔参数。如果您想深入观察整个对象的更改,则需要指定true
。
发布于 2014-03-25 09:13:04
服务本质上类似于类和内部方法。您可以设置一个方法,您可以从控制器调用该方法,该方法的参数是作用域并应用监视表达式:
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的公认答案。如果你试图在一个局部作用域中$watch一个$scope变量,那么上面是你最好的选择。他们正在实现两个截然不同的目标。
发布于 2018-02-28 00:48:37
嘿,刚刚有一个情况,我有一个相当大的手表设置在两个不同的控制器上。
因为我不想重复我刚刚定义的任何代码,以便在我的服务中运行:
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的经验,所以我不能真正深入讨论这种方法的性能方面,但它是有效的;)
https://stackoverflow.com/questions/17806600
复制相似问题