Angularjs服务回调以更新控制器的范围

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的引用。


您可以依赖$rootScope并在服务中调用apply。

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;
    });
  }
});


使用$scope.$watch功能。看看我的琴。我没有你的库,所以我只模拟它-值在5秒后从0变为1。