我将模块组织与命名空间一起使用。每个模块都在.config
中进行路由。但是我无法注入来自另一个模块(主要模块)的常量。
我的常量CRM.Config
包含所有项目配置,例如URL,api key ......此常量位于app.main
内。我无法在app.<any module name here>
中注入它。
一些代码:
app.js
var app = {};
app.main = angular.module('CRM', [
// Tools
'ngRoute',
'oc.lazyLoad',
'satellizer',
// Modules
'CRM.Navbar',
'CRM.Auth'
]);
config.js(由Gulp生成)
angular.module('CRM')
.constant('CRM.Config', {
"project": {
"env": "dev",
"title": "CRM",
"url": "http://..."
},
"oauth": {
"client_id": "...",
"redirect_uri": "..."
},
"api": {
"endpoint": "http://..."
}
});
现在在另一个模块中,例如 auth.js
app.auth = angular.module('CRM.Auth', ['ngRoute', 'oc.lazyLoad']);
app.auth.config(['$routeProvider', '$authProvider', 'CRM.Config', function ($routeProvider, $authProvider, config) {
// Throws an error cause of 'CRM.Config':
// Failed to instantiate module CRM due to: Error: [$injector:modulerr]...
// Routing here...
// HERE I WANT TO PUT MY CONFIG (NOT HARD CODED VALUES)
$authProvider.google({
url: 'http://...',
clientId: '...',
redirectUri: 'http://...'
});
}]);
我听说你只能在.config()
中注入提供者和常量。那我在哪里错了?如果不清楚,请告诉我。
解答:
angular.module('CRM.Config', [])
.constant('config', {
"project": {
"env": "dev",
"title": "CRM",
"url": "http://..."
},
"oauth": {
"client_id": "...",
"redirect_uri": "..."
},
"api": {
"endpoint": "http://..."
}
});
app.auth.config(['$routeProvider', '$authProvider', 'config', function ($routeProvider, $authProvider, config) {
}]);
答案 0 :(得分:0)
您是否忘记在CRM
模块定义中要求CRM.Auth
模块,如此
app.auth = angular.module('CRM.Auth', ['ngRoute', 'oc.lazyLoad', 'CRM'])
这是有效的:
angular.module('foo', [])
.constant('config', {
val: 1
})
angular.module('bar', ['foo'])
.config(function(config) {
console.log(config)
})
请注意,我测试时ng-app
的值为bar
。
请参阅此Plunk。
答案 1 :(得分:0)
问题是依赖模块的构造顺序。如果模块CRM
依赖于模块CRM.Auth
,则意味着CRM.Auth
将在 CRM
之前实例化。只有在CRM
构建后CRM.Config
才可用。当然,您仍然可以在任何模块的应用程序生命周期的运行阶段使用CRM.Config
。
请参阅此plunk进行演示。