我正在构建一个必须使用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 theproviderCache
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/