在控制器和指令之间传递服务
Passing service between controllers and directives
我有一个单独的服务定义如下:
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
向下。
还有什么其他方法?
您可以做的是,将您的服务设置在作用域下,即$scope。myService = myService,然后你可以直接从HTML中访问它。
你还需要将$scope发送给你的服务,这样一旦它获取数据,你就可以运行$scope.$apply()。
现在的问题是你在控制器初始化时设置它。控制器将不会再次初始化,因此它将永远不会更新。
$watch只有在作用域被$digest后才会被更新。参考文档
这是我最好的猜测,为什么绑定不工作。
最初你将数组设置为
mySource = [];
当数据来自服务器时,您将替换引用。
mySource = success.data;
你可以尝试mySource.push
方法来更新初始数组中的数据。
还想指出,第一个$watch表达式应该将第一个参数作为变量名字符串,而不是变量本身。
- 使用服务(AngularJS)在控制器之间共享数据
- 通过共享服务在两个不同ng应用程序中的控制器之间共享数据
- 使用工厂/服务在控制器AngularJS之间推送数组中的数据
- 如何在控制器之间共享来自休息服务的数据
- 通过服务在控制器之间同步数据
- 角度依赖注入,使用服务在模块之间传递值
- Angularjs 在不同页面上存在的服务之间传递数据
- 使用AngularJS服务将数据从一个html传输到另一个html(控制器之间的数据共享)
- 使用服务更新 2 个控制器之间的共享数据
- 如何在服务中定义数组并在 AngularJS 中的 2 个控制器之间共享它
- AngularJS:在控制器之间共享数据,具有服务和 restangular
- 通过服务在控制器之间共享$http对象
- 在两个不同的模块和两个不同的js文件之间共享服务
- $parse、$interpole和$compile服务之间的区别是什么
- 在AngularJS控制器和服务之间共享资源
- 如何在服务之间进行双向通信
- JavaScript和PHP中的Web服务之间的安全通信
- Backbone.js集合和带参数的Ruby on Rails服务之间的通信
- AngularJS:如何在两个隔离的控制器和一个共享服务之间创建一个双向数据绑定
- 服务之间的广播