2017-02-03 133 views
0

我的用例是:我们有几个助手类,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 
}); 

这工作,如果我在这个顺序一个文件有CarParameterService

然而,当我分裂CarParameterService到多个磁盘上的文件,或者我在同一个文件Car之前定义ParameterService$injector.get('CarProvider')ParameterService失败。

我该如何解决这个问题?

我想为每个文件提供一个提供程序/服务,但我不明白缺失的是什么。

+0

你可以提供一个失败的文件夹(分隔文件)吗? – ConcurrentHashMap

回答

2

其中服务是指在运行阶段,其中服务实例注入无关紧要的顺序。但在服务提供商注入的配置阶段,即在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块是否需要自己的模块取决于它的功能(主要是出于测试原因)。

1

有可能让提供商在不同的文件中。您只需将它们附加到您创建的第一个模块。

如果您的标记看起来是这样的:

<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 Demo

+0

我明白你的意思,但我不认为这是问题所在。我会尽量让以后更好(现在不用电脑) –

+0

你看看Plunkr演示了吗? – Jukebox