我的印象是使用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"));
,然後由角服務卷繞成它可以注入到控制器中:
app.factory("NonAngularService", function(){
return NonAngularService;
});
其他服務做同樣的事情,但角度服務中完全定義:
app.factory("AngularService", function($q){
return {
doStuff: {
var d = $q.defer()
// do async function, like setTimeout, and d.resolve()
return d.promise;
}
}
});
只有在第二種情況下,$摘要被自動調用:
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
這似乎是正確的(至少在部分情況下,如果注入器注入相同的$ q,但沒有訪問$ scope的則注入)。我嘗試了相反的情況([plunker](http://plnkr.co/edit/23DVH0BixsvKey9sqKPL?p=preview)),我在不使用典型DI的情況下注入「AngularService」,並且它不會調用$ digest。 – 2014-11-04 06:43:43