我的AngularJS应用程序应该使用一个主模块还是多个?

时间:2014-06-17 19:51:09

标签: angularjs grails

我正在尝试将AngularJS添加到我正在处理的Grails应用程序中。

具体而言,我将Angular功能添加到我的网站的一个部分,例如添加到用户的所有页面。

我开始创建一个用户模块,我正在添加控制器和服务。然后我找到了一个我需要一些基本配置代码的地方,我知道我会想要在我的网站的其他区域 - 转换http参数,以便我的后端可以理解它们(http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/)。

这让我相信我的整个应用程序需要一个基本模块。但是,我仍然是Angular的新手,我不明白我的Users模块将如何从基本模块继承此配置。这甚至可能吗?或者我应该只有一个基本模块,我将整个应用程序的每个控制器和服务添加到?

编辑:经过一些测试后,看起来如果我定义一个模块,然后将其作为另一个模块的依赖项:

var moduleB = angular.module('ModuleB', ["ModuleA"])

ModuleB中的我的配置将在ModuleB中得到尊重。这对我来说没有任何意义,如果我列出两个具有冲突配置的依赖项怎么办?

2 个答案:

答案 0 :(得分:1)

如果来自两个不同模块的指令尝试在同一元素上创建范围,Angular会抱怨。如果您有不同的具有相同名称的指令,则可能更有可能发生这种情况。

为了降低指令冲突的可能性,您应该在具有唯一命名空间的模块中定义指令(采用ng)。

我建议你有一个带有依赖项的ng-app。

答案 1 :(得分:1)

我们解决这个问题:

  1. 创建核心'包含所有基本功能的模块(例如:' baseHttp',某些工厂工厂,模板缓存工厂和其他基本服务)。
  2. 创建特定模块。例如:

    var task = angular.module('task', ["core"]);

  3. 然后,如果需要我们将基本服务(如utils工厂)注入“任务”#39;控制器或服务,只需使用它。但有时我们需要从基本服务继承并添加/覆盖方法。为此,我们使用klass.js(您可以使用任何其他继承库)。例如:

    核心'模块

    (function (module) {
      module.factory("baseHttp", baseHttp);
    
      baseHttp.$inject = ['baseRest'];
      function baseHttp(baseRest) {
    
          var api = {             
              createItem: function (item) {
                  return this.post("create", item);
              },           
    
              // ... other methods  
    
          };
    
          return baseRest.extend(api);
      };     
    
    })(angular.module("core"));
    

    ' baseRest'是角度的装饰者' $ http'。

    任务'模块:

    (function (module) {
      module.factory("baseHttp", taskHttp);
    
      taskHttp.$inject = ['baseHttp'];
      function taskHttp(baseHttp) {
    
          var api = {  
              // override base method          
              createItem: function (item) {
                  return this.post("createTask", item);
              },           
    
              // add new method
              read: function (id) {
                  return this.get("readTask", id);
              }, 
    
              // ... other methods  
    
          };
    
          return baseHttp.extend(api);
      };     
    
    })(angular.module("task"));
    

    因此,我们可以从核心继承一些服务,或者只是在代码中使用核心服务。