javascript - AngularJS 将工厂注入(inject)提供者

标签 javascript angularjs

我正在构建一个必须使用provider配方的模块,因为它需要在运行前进行配置。我对模块化我的代码感兴趣,所以我想向提供者注入(inject)一些服务。我知道将 providers 注入(inject)其他 providers 很简单,但对于我想要实现的目标来说似乎有点过分了,所以我想注入(inject)一个 工厂 相反。

据我了解,在运行时使用$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 的访问吗?即使提供程序中的方法在配置阶段没有运行?

此外,我之前没有见过我使用的方法 $injector.get('wfTabletUsageDataCacheProvider').$get() 。虽然它有效,但这是实现此类功能的糟糕方法吗?

感谢您的指导。

最佳答案

在配置阶段(config() block 或提供程序),您可以注入(inject)提供程序常量,而不是工厂、服务或值(value)观。如果提供程序对您来说太过分了,您可以使用常量。

这样的东西可以工作

_tudModule.constant('wfTabletUsageDataCache', {
  addToLog: function () { ... }
});

_tudModule.provider('$tabletUsageData', [ 'wfTabletUsageDataCache',
  function (wfTabletUsageDataCache) {
     wfTabletUsageDataCache.addToLog(...)
  }
]);
<小时/>

When using the $injector during the config phase, you get access to the providerCache which holds uninstantiated services.

看来您是正确的,但这种用法没有记录,并且通常不鼓励使用。 $injector 是一项服务,不应将其注入(inject)到提供程序中。

<小时/>

Also, I haven't seen the method I am using $injector.get('...').$get() before.

提供者是定义 Angular 服务的最低级别的方式。所有 .service().factory().value() 定义都可以使用 .provider()< 重写。根据定义,当提供程序实例化时,它必须公开一个可注入(inject)并负责返回服务实例的 $get 方法。

这就是您在这里看到的。您将使用 $injector.get(...) 检索(并实例化)提供程序,然后使用 $get() 方法创建服务实例。但是,这通常发生在幕后,并且 $get() 方法并不意味着手动调用。

您本质上是在尝试绕过不允许在运行阶段之前实例化服务的限制。不建议这样做。

关于javascript - AngularJS 将工厂注入(inject)提供者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33747582/

相关文章:

javascript - Requirejs - 版本控制

javascript - 从 Bootstrap 模式编辑表格行

javascript - 延迟加载 vue-i18n 中 `en.js` 或 `ja.js` 的格式是什么

javascript - Jquery - 选择复选框时按钮未启用

javascript - 如何在 Angular JS 中获得自动完成功能?

css - Bootstrap Grid 无法在平板电脑上缩放,

javascript - 选择链接元素并将其样式设置为第 n 种类型时,链接元素不显示

javascript - $timeout 中的 "Controllers as"语法

javascript - AngularJS 获取和设置元素高度

c# - WebAPI ActionName 路由半工作