2015-02-23 194 views
6

我有一個包含一些'私人'服務的角度模塊。那些私人服務只需要在同一個模塊中的其他服務,並且將它們公開以供測試是有意義的。但我不希望其他模塊使用此服務。私人角度服務或控制器

有沒有可能標記這些服務的「私人」?是否至少有一個公約來命名這些服務,以便其他人將其識別爲私有?

+0

這是什麼目的?您可能不會將它們注入到您不想使用它們的模塊中。 – ribsies 2015-02-23 17:55:55

+0

不,我還沒有看到與Angular-UI庫一起使用的任何特定約定,例如 – 2015-02-23 17:59:26

+0

可能的[如何創建私有工廠在angularjs?](http://stackoverflow.com/questions/24284756/how-to-create-private-factory-in-angularjs) – 2015-02-23 18:09:21

回答

1

如果您需要將這些「類」作爲角度服務的唯一原因是讓它們的依賴關係無痛地注入,那麼可以使用$injector.instantiate來實例化它們,而無需將它們註冊爲服務。

示例代碼:

var PrivateClass = (function() { 
    function PrivateClass($log) { 
     this.hello = function() { $log.debug("Hello World!");} 
    } 
    PrivateClass.$inject = ["$log"]; 
    return PrivateClass; 
})(); 

angular.module('TestApp', []).run(['$injector', function ($injector) { 
    var p = $injector.instantiate(PrivateClass); 
    p.hello(); 
}]); 

您將在構造函數中使用$injector.instantiate(PrivateClass)(或任何地方),需要它的服務範圍內,打造PrivateClass的一個實例。如果你需要PrivateClass的行爲像一個單身人士(如真正的角度服務),你可以使用一個訪問器類來實例化它,並返回其調用者的引用。

這樣做的好處是,您不需要污染實例化服務(在這種情況下將函數傳遞給angular.run),只需要依賴項的依賴項數組可以傳遞給PrivateClass($ log在這種情況下)。

我注意到這是一個古老的問題,但是我在找到一種方法來實現上述目標並最終使用這種方法解決問題時找到了這個問題。

相關問題