我有一项服务定义如下:
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
});
});
然后将此服务注入多个控制器,各种指令(其中一些具有隔离范围)。在其中只有一个(截至目前),实际执行了fetch(和结果集)操作,但是用户可以通过点击交互重复执行获取操作。
其他控制器如此绑定:
$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
次迭代?该解决方案的效率如何(in)?)
我该如何解决这个问题?如果愿意,我如何“通过引用”绑定到服务变量?
可能有更好的方法吗?我尝试了一些事件,但由于其中一些元素是兄弟姐妹,这会导致一个过于复杂的链,一个孩子可能$emit
最多让一个联合父母的监听器捕获一个事件而$broadcast
返回下来。
还有其他方法吗?
答案 0 :(得分:2)
您可以做的是,在范围内设置您的服务,I.E。 $ scope.myService = myService,然后您可以直接从HTML访问它。
您还需要将$ scope发送到您的服务,因此一旦获取数据,您就可以运行$ scope。$ apply()。
现在的问题是你在控制器初始化时设置它。控制器不会再次初始化,因此永远不会更新。
$ watch只会在范围为$ digest'd后更新。请参阅文档here
答案 1 :(得分:1)
这是我最好的猜测,为什么绑定不起作用。
最初您将数组设置为
mySource = [];
稍后在数据来自服务器时替换引用。
mySource = success.data;
您可以尝试使用mySource.push
方法更新初始数组中的数据。
另外只想指出第一个$ watch表达式应该将第一个参数作为变量名字符串而不是变量本身。