我的印象是使用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
答案 0 :(得分:1)
我自己从未使用过angular.injector,但它看起来很像你得到的$q
并不完全是指令中动态依赖注入传递的那个。两者之间的差异在解决时触发$digest
,而另一个实际上会在下一个摘要周期内触发其then
调用。
我在你的代码中试图理解这个小变化(不同之处在于我们在参数中传递$ q而不是通过angular.injector获取它。)
http://plnkr.co/edit/ZGjfWUViz4iidvxd0hre?p=preview
这可能来自某些角度版本的变化,当他们决定$q
应该处理摘要周期本身时。我想直接与github或谷歌小组的开发人员进行讨论会很有趣。
PS:我的getNonAngularService
实际上已成为我同意的服务,更重要的是要证明$q
不同。