Angular 1:$注入器在提供者内部注入提供者时找不到提供者依赖项
我的用例是:我们有几个助手类,A和B,它们是服务,A依赖于B,我想使他们的提供者可以在.config阶段使用它们。
我跟着this SO answer在供应商内部加载供应商。
正如你可以在这里看到,它的工作原理:
http://plnkr.co/edit/SIvujHt7bprFumhxwJqD?p=preview
var coreModule = angular.module('CoreModule', []);
coreModule.provider('Car', function() {
//CarProvider.engine
this.engine = 'big engine';
//Car
this.$get = function() {
return {
color: 'red'
};
};
});
coreModule.provider('ParameterService', ['$injector', function($injector) {
try {
var CarProvider = $injector.get('CarProvider');
this.deepEngine = CarProvider.engine;
console.log('deepEngine = ' + this.deepEngine);
} catch (e) {
console.log("nope!")
}
// ParameterService
this.$get = function() {
return {};
};
}]);
coreModule.config(function(CarProvider) {
console.log('configEngine = ' + CarProvider.engine); // big engine
});
这工作,如果我在这个顺序一个文件有Car
和ParameterService
。
然而,当我分裂Car
和ParameterService
到多个磁盘上的文件,或者我在同一个文件Car
之前定义ParameterService
,$injector.get('CarProvider')
内ParameterService
失败。
我该如何解决这个问题?
我想为每个文件提供一个提供程序/服务,但我不明白缺失的是什么。
其中服务是指在运行阶段,其中服务实例注入无关紧要的顺序。但在服务提供商注入的配置阶段,即在provider
构造函数和config
块中,它确实很重要。
提供者和配置块按其定义的顺序执行。如果Car
提供程序在ParameterService
提供程序或config
块之后定义,则在执行这两个程序时不存在CarProvider
。
为了避免潜在的竞争条件,应遵循每个文件模式一个模块。这样可以保持应用程序的高度模块化(也有利于测试),并且从不在意文件的加载顺序。例如。:
angular.module('app', ['app.carService', 'app.parameterService']).config(...);
angular.module('app.carService', []).provider('Car', ...);
angular.module('app.parameterService', []).provider('ParameterService', ...);
模块部件在其中模块在angular.module
阵列层次结构中定义,从小孩到父母的顺序执行。
决定config
块是否需要自己的模块取决于它的功能(主要是出于测试原因)。
有可能让提供商在不同的文件中。您只需将它们附加到您创建的第一个模块。
如果您的标记看起来是这样的:
<script src="coreModule.js"></script>
<script src="parameterService.js"></script>
然后,在coreModule.js,定义模块:
angular.module('CoreModule', [])
.provider('Car', function() {
...
}
记住,第二个参数([]
)告诉角度来创建一个新的模块。
然后,声明在不同的文件中您的其他提供商,并将其连接到现有“CoreModule”模块:
angular.module('CoreModule')
.provider('ParameterService', ['$injector', function($injector) {
...
}
请注意,我们只是传递一个参数.module()
。这告诉角度将您的提供者添加到现有的模块。
我明白你的意思,但我不认为这是问题所在。我会尽量让以后更好(现在不用电脑) –
你看看Plunkr演示了吗? – Jukebox
你可以提供一个失败的文件夹(分隔文件)吗? – ConcurrentHashMap