为什么在使用$ q时不会自动触发$ digest

时间:2014-11-04 05:48:45

标签: angularjs angularjs-service

我的印象是使用Angular的内置函数(如$timeout$q等...)会自动触发$digest。但它似乎只适用于在Angular中完全定义的服务,但不适用于Angular之外定义的服务,即使它们使用$q并通过包装器服务公开。的为什么吗

假设我有2个服务做同样的事情:

第一个是普通的JS服务,使用$q

var NonAngularService = (function($q){

return {
   doStuff: {
       var d = $q.defer()
       // do async function, like setTimeout, and d.resolve()
       return d.promise;
   }
}

})(angular.injector(["ng"]).get("$q"));

然后由Angular Service包装,以便可以将其注入控制器:

app.factory("NonAngularService", function(){
   return NonAngularService;
});

其他服务做同样的事情,但在Angular服务中完全定义:

app.factory("AngularService", function($q){
   return {
       doStuff: {
           var d = $q.defer()
           // do async function, like setTimeout, and d.resolve()
           return d.promise;
       }
    }
});

仅在第二种情况下,自动调用$ digest:

NonAngularService.doStuff()
  .then(function(data) {
      $scope.data1 = data;
      $scope.$digest(); // required here
  });

AngularService.doStuff()
  .then(function(data) {
      $scope.data1 = data;
      // $scope.$digest(); // Not required here
  });

这是plunker

1 个答案:

答案 0 :(得分:1)

我自己从未使用过angular.injector,但它看起来很像你得到的$q并不完全是指令中动态依赖注入传递的那个。两者之间的差异在解决时触发$digest,而另一个实际上会在下一个摘要周期内触发其then调用。

我在你的代码中试图理解这个小变化(不同之处在于我们在参数中传递$ q而不是通过angular.injector获取它。)

http://plnkr.co/edit/ZGjfWUViz4iidvxd0hre?p=preview

这可能来自某些角度版本的变化,当他们决定$q应该处理摘要周期本身时。我想直接与github或谷歌小组的开发人员进行讨论会很有趣。

PS:我的getNonAngularService实际上已成为我同意的服务,更重要的是要证明$q不同。