2015-10-14 77 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