簡體   English   中英

AngularJS將工廠注入提供者

[英]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 如果必須在configconfig提供程序,則所有與實例相關的代碼都應轉到$get (因為factory只是具有唯一$get方法的provider Sugar語法)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM