我有一个单一的服务定义如下:
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
退出。
还有哪些其他方法?