2014-11-04 50 views
1

我的印象是使用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

回答

1

我從來沒有使用過angular.injector,但它看起來像你從中獲得的$q並不完全是通過指令動態依賴注入傳遞的。兩者之間的差異在解決時觸發$digest,而另一個在下一個摘要週期期間實際觸發其承諾then

我已經在你的代碼中設置了這個小小的改變,試圖理解(不同的是我們通過$ q參數而不是通過angular.injector獲取它)。

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

這可能來自於某些版本的角度發生變化時,他們決定$q應該處理的消化週期本身。我想直接與其在github或谷歌羣體上的開發人員討論這將是有趣的。

PS:我的getNonAngularService實際上成爲我的服務我同意,點更多證明$q是不同的。

+0

這似乎是正確的(至少在部分情況下,如果注入器注入相同的$ q,但沒有訪問$ scope的則注入)。我嘗試了相反的情況([plunker](http://plnkr.co/edit/23DVH0BixsvKey9sqKPL?p=preview)),我在不使用典型DI的情況下注入「AngularService」,並且它不會調用$ digest。 – 2014-11-04 06:43:43