【发布时间】:2013-06-19 05:38:24
【问题描述】:
我有一个单一的服务定义如下:
angular.module('myApp')
.factory('myService', function ($resource, $q) {
mySource = [];
EndPoint = $resource('/my/api/endpoint', {});
return({
getSourceAsFunction: function(){
return(mySource);
}
,getSourceAsValue: mySource,
,setSource: function(newSource){
mySource=newSource;
}
,fetchSource: function(attributes){
request = $q.defer
EndPoint.get(attributes
,function(success){
request.resolve(success.data);
//mySource['headersArray'] = success.data['headersArray'];
//mySource['footersArray'] = success.data['footersArray'];
},function(failure){
request.reject(failure);
});
request.promise
});
});
这个服务然后被注入到多个控制器中,在各种指令上(其中一些具有隔离范围)。只有其中一个(截至目前)实际执行了获取(和结果集)操作,但用户可以通过点击交互重复执行获取操作。
其他控制器绑定如下:
$scope.fooVar = myService.getSourceasValue;
或
$scope.fooVar = myService.getSourceAsFunction();
在这两种情况下,当服务中的值更改时,变量都不会自动更新。
像这样设置$watch:
$scope.$watch('fooVar', function(newVal, oldVal){console.log('hi')}, true);
也永远不会触发(在这两种情况下)。
资源回调中的两行注释:
//mySource['headersArray'] = success.data['headersArray'];
//mySource['footersArray'] = success.data['footersArray'];
mySource 那时被实例化为{}。这并没有解决问题。
之前是否曾尝试重用同一个对象。
我发现解决此限制的一种方法是像这样设置 $watch:
$scope.$watch(function(){return(myService.getSourceAsFunction())}
, function(newVal, oldVal){console.log('hi'), true)};
但是,我发现这令人担忧,因为我不希望此功能在后台持续运行。 (这是如何工作的?该函数多久运行一次?触发了多少$digest 迭代?该解决方案的效率如何(低)?)
我该如何解决这个问题?如果愿意,我如何“通过引用”绑定到服务变量?
可能有更好的方法吗?我尝试了事件,但是由于其中一些元素是同级元素,这导致了一个过于复杂的链,其中一个孩子可能$emit 让一个联合父级的侦听器捕获一个事件,然后$broadcast 回退。
还有哪些其他方法?
【问题讨论】:
标签: javascript angularjs angularjs-scope angularjs-service