2015-10-14 73 views
-1

我有几个“模块”(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文件是自动的,所以如果我更改设置,我的测试将保持机智。

必须有一个少肮脏,多角度解决这个问题的方法?

回答

4

使用constant()

(function() { 
'use strict'; 

angular.module('app.admin', [ 
    'app.foo', 
    'app.bar' 
]).constant('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 
    }); 
})(); 

然后通过在注射CONST使用它。例如:

function AdminContentController(foo, bar, CONST) {...} 
AdminContentController.$inject = ['foo', 'bar', 'CONST']; 
+0

我试过这个,但是这并没有完成这项工作。如果我只有1个模块,这很好。如果我在例如模块foo中注入CONST,我实际上注入了在admin中定义的CONST的值,而不是在foo中定义的值。 – marcelde

+0

@marcelde角度中的名称是全局唯一的,所以这是预期的行为。如果你想在不同的模块中使用不同的常量,给他们不同的名字。它不会改变你使用它们的方式,因为现在你正在执行'angular.module('app.foo').CONST'和'angular.module('app.bar').CONST'。相反,只需执行'.constant('fooCONST',...)'和'.constant('barCONST',...)'。你的权利是 – tcooc

+0

建议的解决方案意味着我必须更改所有依赖文件中的注入名称。为了保持可读性,我还必须在代码本身中更改注入的CONST的名称。每个“模块”我有12个依赖文件。 23个模块.... 23 *(12 + 1)导致299个文件改变和aprox。 11960变化。我的周末过去了。所有类型的方法都可以工作。但由于影响巨大,我正在寻找“最佳”解决方案。很高兴找到一种解决方案,使事情变得简单但灵活且自动化。 – marcelde