我有几个“模块”(aprox.20)具有各自的功能,但都具有相同的结构。每个“模块”都分布在不同的文件中。例如管理员“模块”被存储在模块/ admin文件夹,它包括以下文件:Angularjs模块宽常量最佳实践
admin.module.js
admin.routes.js
admin.content.jade
admin.content.controller.js
admin.content.controller.spec.js
admin.sidebartop.jade
admin.sidebar.controller.js
admin.sidebar.controller.spec.js
and many more......
所有模块的所有类似的文件具有相同的码结构。所有的代码都封装在iFi中。
为了避免错误,并进行结构重用容易,我需要定义一些模块的具体常量和重用控制器,路线这些常量等
我知道的module.config和恒定功能 。这种方法不能完成这项工作,因为我不能重复使用两次相同的名称。这意味着我仍然需要重写我的代码的某些部分,而我想保持它不变。
angular.module('app.foo').constant('CONST', {...})
将冲突
angular.module('app.bar').constant('CONST', {...})
于是我想出了以下解决方案,这个工作得很好,但不知何故不觉得正确的计算策略。:
我所有的静态配置在* .module.js完成文件
(function() {
'use strict';
angular.module('app.admin', [
'app.foo',
'app.bar'
]).CONST ={
module: 'Admin',
state: 'admin',
url : '/admin',
path: 'app/views/modules/admin/',
title: 'Admin',
description: 'This is the admin module',
acl: ['Developer','Administrator'],
tileGroups: ['Company'],
icon: 'mif-books',
badge: 0,
filters :
{'rootNodes' :{where: {'Template.value' : 'Admin'} } },
ready : false
};
})();
我重用* .routes.js配置:
(function() {
'use strict';
var module =angular.module('app.details');
var CONST = module.CONST;
module.run(appRun);
appRun.$inject = [ 'routerHelper'];
/* @ngInject */
function appRun(routerHelper) {
var states = [{
state: CONST.state,
config: {
title: CONST.title,
url: CONST.url,
acl: CONST.acl,
templateUrl: CONST.path + CONST.state + '.content.html',
controller: CONST.module + 'ContentController',
controllerAs: 'vm',
ncyBreadcrumb: {
label: CONST.module
}
}
}
];
routerHelper.configureStates(states);
}
})();
在我所有的* 。* .control.js文件:
(function() {
'use strict';
angular
.module('app.admin')
.controller('AdminContentController', AdminContentController);
AdminContentController.$inject = ['foo', 'bar'];
/* @ngInject */
function DetailsContentController(foo, bar) {
var vm = this;
_.extend(vm, CONST); // for re-usage in my jade/html files
// AND HERE GOES THE ACTUAL CODE
}
})();
此方法的目的是为了尽量减少neede d在个别文件中,如果某些东西改变“模块”宽。
例如,如果我将标题从'Admin'更改为'Administration',则不必在使用标题的所有文件中更改此名称。此外,我的spec.js文件是自动的,所以如果我更改设置,我的测试将保持机智。
必须有一个少肮脏,多角度解决这个问题的方法?
我试过这个,但是这并没有完成这项工作。如果我只有1个模块,这很好。如果我在例如模块foo中注入CONST,我实际上注入了在admin中定义的CONST的值,而不是在foo中定义的值。 – marcelde
@marcelde角度中的名称是全局唯一的,所以这是预期的行为。如果你想在不同的模块中使用不同的常量,给他们不同的名字。它不会改变你使用它们的方式,因为现在你正在执行'angular.module('app.foo').CONST'和'angular.module('app.bar').CONST'。相反,只需执行'.constant('fooCONST',...)'和'.constant('barCONST',...)'。你的权利是 – tcooc
建议的解决方案意味着我必须更改所有依赖文件中的注入名称。为了保持可读性,我还必须在代码本身中更改注入的CONST的名称。每个“模块”我有12个依赖文件。 23个模块.... 23 *(12 + 1)导致299个文件改变和aprox。 11960变化。我的周末过去了。所有类型的方法都可以工作。但由于影响巨大,我正在寻找“最佳”解决方案。很高兴找到一种解决方案,使事情变得简单但灵活且自动化。 – marcelde