[英]AngularJS Getting Unknown provider error injecting a constant into a factory
[英]AngularJS injecting a factory into a provider
我正在構建一個必須使用provider
配方的模塊,因為它需要在運行時進行配置。 我對模塊化我的代碼感興趣,因此我想向提供程序中注入一些服務。 我知道將providers
注入其他providers
很簡單,但是對於我要實現的目標來說似乎過於矯kill過正,所以我想注入一個factory
。
據我了解,在運行時使用$injector
使我們可以通過angular的createInternalInjector
方法訪問instanceCache
,該方法返回已實例化的服務。
在配置階段使用$injector
時,您可以訪問providerCache
緩存,其中包含未實例化的服務。
我覺得這個假設一定是不正確的。 在下面的代碼中, $injector
在提供程序中使用,但通過在應用程序運行階段調用的函數來使用。 我希望能夠訪問instanceCache
但只能通過$injector.get
方法來訪問providerCache
。
_tudModule.factory('wfTabletUsageDataCache', [
function () {
return {
addToLog: fn () { … }
}
}
])
_tudModule.provider('$tabletUsageData', [
'$injector', function $tabletUsageDataProvider ($injector) {
function getCacheFactory() {
return $injector.get('wfTabletUsageDataCacheProvider').$get();
}
function logInteraction(state, buttonId) {
getCacheFactory().addToLog(); // fn() called
}
]);
provider
的$injector
會禁用對instanceCache
訪問嗎? 即使在config
階段未運行提供程序中的方法時?
另外,我之前還沒有看過使用$injector.get('wfTabletUsageDataCacheProvider').$get()
。 雖然有效,但這是實現這種功能的不好方法嗎?
感謝您的指示。
在配置階段,( config()
塊或提供程序)可以注入提供程序和常量 ,而不是工廠,服務或值。 如果提供者對您而言過於矯kill過正,則可以使用一個常量。
這樣的事情可能會起作用
_tudModule.constant('wfTabletUsageDataCache', {
addToLog: function () { ... }
});
_tudModule.provider('$tabletUsageData', [ 'wfTabletUsageDataCache',
function (wfTabletUsageDataCache) {
wfTabletUsageDataCache.addToLog(...)
}
]);
在配置階段使用
$injector
時,您可以訪問providerCache
緩存,其中包含未實例化的服務。
看來您是正確的,但是這種用法沒有記錄在案,通常不建議使用。 $injector
是一項服務,不應將其注入提供程序。
另外,我之前還沒有看過使用
$injector.get('...').$get()
。
提供程序是定義Angular服務的最底層方法。 所有.service()
.factory()
或.value()
的定義可以使用改寫.provider()
根據定義,在實例化提供程序時,它必須公開一個$get
方法,該方法可以注入並負責返回服務的實例。
這就是您在這里看到的。 您正在使用$injector.get(...)
檢索(並實例化)提供程序,然后使用$get()
方法創建服務實例。 但是, 這通常發生在幕后,並且$get()
方法並不意味着必須手動調用。
您實質上是在嘗試解決不允許在運行階段之前實例化服務的限制。 不建議這樣做。
您的假設是正確的。 您錯過的事情是有兩個不同的注入器,分別用於服務提供者和服務實例。 將provider注入器注入provider
,即使在配置階段之后,它仍將繼續與provider處理。 您也可以檢查此答案以進行澄清。
使用$injector.get('someProvider').$get()
將返回與instanceCache
無關且不是單例的新服務實例。 即
$injector.get('someProvider').$get() !== $injector.get('someProvider').$get();
$get
背后沒有任何魔力,它只是一個構造函數,注入器沒有任何手段或原因來跟蹤其調用。
對於當前的代碼factory
可以安全地使用而不是provider
。 如果必須在config
中config
提供程序,則所有與實例相關的代碼都應轉到$get
(因為factory
只是具有唯一$get
方法的provider
Sugar語法)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.