Angularjs service callback to update scope of controller
具有第三方库回调函数的服务:
1 2 3 4 5 6 7 | mbAppModule.service('aService', function ($http) { this.data={"somedata":0}; var m3rdPartLib="init"; // init m3rdPartLib.on('timeupdate', function() { this.data.somedata=1; }); } |
和一个控制器
1 2 3 4 5 | mbAppModule.controller({ MController: function ($scope, $http, mService) { $scope.mService= mService; }); }); |
HTML页面
1 | {{mService.data.somedata}} |
问题:
m3rdpartlib.on()是一个第三方库回调函数,我在服务中使用它。我想在用户界面中显示它,因为它正在被更新。在回调时,值将被更改,但不会反映在UI上。
读取一些文档并找到$rootscope。$apply可以被调用,但服务中没有$scope/$rootscope的引用。
您可以依赖
1 2 3 4 5 6 7 8 9 10 11 | mbAppModule.service('aService', ["$http","$rootScope", function ($http, $rootScope) { this.data = { "somedata": 0 }; var m3rdPartLib ="init"; // init m3rdPartLib.on('timeupdate', function () { $rootScope.$apply(function(){ this.data.somedata = 1; }); }); }]); |
我需要从一个服务中更新一个输入字段,因为它有监听器,并且没有随机和动态地改变数据。
这也可用于调用控制器中的作用域函数:
1 2 3 4 5 6 7 | //scope will be set to current scope of a controller //which has an ng-view containing this element var scope = angular.element('#input-element').scope(); //wrap changes in an apply call to make sure view and model are consistent scope.$apply(function() { scope.object.data = value; }); |
感谢本文:如何使用angularjs访问浏览器控制台中的$scope变量?
如果您在服务中使用scope,那么这是一个很好的指示,表明您正在破坏srp,因为您的服务应该只检索数据到您的控制器。我的建议是你可以这样做。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | mbAppModule.service('aService', ["$http","$rootScope", function ($http, $rootScope) { this.data = { "somedata": 0 }; var m3rdPartLib ="init"; // init this.GetPartLib = function () { return m3rdPartLib; } }]); mbAppModule.controller({ MController: function ($scope, $http, mService) { this.GetPartLib = function (){ mService.on('timeupdate', function() { this.data.somedata=1; }); } }); |
使用