AngularJS将工厂注入提供者
AngularJS injecting a factory into a provider
我正在构建一个模块,该模块必须使用provider
配方,因为它需要在运行前进行配置。我对模块化我的代码很感兴趣,所以我想向提供者注入一些服务。我知道将providers
注入到其他providers
中很简单,但对于我试图实现的目标来说似乎有些过头了,所以我想注入一个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()
块或提供程序)可以注入提供程序和常量,而不是工厂、服务或值。如果提供者对你来说太过分了,你可以使用常量。
像这样的东西可以工作
_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
中,即使在配置阶段之后,它也将继续处理提供者。您也可以查看此答案以进行澄清。
使用$injector.get('someProvider').$get()
将返回一个与instanceCache
无关且不是单例的新服务实例。即
$injector.get('someProvider').$get() !== $injector.get('someProvider').$get();
$get
背后并没有什么魔力,它只是一个构造函数,注入器并没有办法或理由跟踪它的调用。
对于当前代码,可以安全地使用factory
来代替provider
。如果必须在config
中配置提供程序,那么所有与实例相关的代码都应该转到$get
(因为factory
只是provider
的糖语法,只有$get
方法)。
- 使用Objective-C的JavaScript注入方法
- 正在注入包含JS的HTML
- 迷你$provider注入茉莉花和角
- Angularjs工厂注入错误
- 通过命令行/批处理文件打开页面时,将javascript代码注入Google Chrome
- 如何在Ionic Android中将Javascript注入到web视图中
- Android Webview通过Javascript注入CSS
- Meteor:在启动时将html注入客户端文件
- 注入工厂时,Angular停止工作
- 注入Javascript以选择具有指定值的所有单选按钮
- XSS通过地址栏注入
- 注入angularjs指令
- Ember服务在注入组件并在计算属性中使用后是未定义的
- AngularJS依赖注入定时问题
- 如何通过铬扩展注入反应元素
- 如何防止在客户端/服务器两侧对文本框进行sql注入
- Ionic将firebase注入工厂,同时将控制器和服务保存在不同的文件中
- AngularJS将工厂注入提供者
- 当将服务注入(导入)到我的构造函数中时;无提供者”;错误
- 嘲弄提供者,注入东西