定义角度模块的不同方法

时间:2016-07-05 09:43:09

标签: angularjs

所以今天我通过互联网搜索我发现了一些有趣的东西。通常我会像这样定义角度模块

var app = angular.module('myApp',[]);
app.controller('myCtrl',function($scope){ 
//some code
})

甚至喜欢这个

 angular.module('myApp',[])
    .controller('myCtrl',function($scope){ 
    //some code
    })

但今天我发现还有另一种定义角度模块的方法

(function(app){

})(angular.module('myApp',[]))

那么初始化之间有什么不同呢。是最有效的方式。我尝试通过互联网搜索,但无法找到解决方案。谢谢你们

4 个答案:

答案 0 :(得分:3)

第一&第二次声明没有任何重大差异。建议使用第三种方案。

  1. 您只是保存角度模块设定器方法的返回值,并通过全局变量重新使用它。

  2. 我们不是使用全局变量来存储模块引用,而是直接在返回值上声明控制器。此模式称为“方法链”

  3. 这里我们使用angular的getter语法,它将返回模块引用。 Getter语法与立即调用的函数表达式(IIFE)一起确保您不会污染全局命名空间。这是编写控制器,服务等的首选方式。
  4. 有关角度的最佳实践,请查看John Papa的AngularJS风格指南

答案 1 :(得分:2)

区别在于:

var app = angular.module('myApp',[]);
app.controller('myCtrl',function($scope){ 
//some code
})

此处app全局变量。您可以从任何地方访问app。您必须避免才能创建全局变量

这段代码也很好。你没有任何全局变量。你需要在一个代码行中创建模块组件。所以如果你需要访问你的模块,你需要用angular.module('myApp')得到它。所以这是一个很好的变体,但不是最好的

angular.module('myApp',[])
    .controller('myCtrl',function($scope){ 
    //some code
    })

最后

(function(app){

})(angular.module('myApp',[]))

这是最好的变体。您正在创建IIFE,即创建一个函数并立即调用它并将module作为参数传递 app现在仅在功能中可见,并且您不会污染全球空间。

性能如何 - 最后一个示例将调用额外的功能,但前2个不会,这里一个函数的调用不会影响性能。

回答评论:
是的,当然是。

在另一个文件中,您可以像这样使用

(function(app){

    })(angular.module('myApp'))

如果你在没有第二个参数的情况下调用angular.module('myApp'),它会尝试查找具有给定名称的模块,如果找到,则返回模块。

答案 2 :(得分:1)

'最佳'声明模块的方法

由于angular位于全局范围本身,模块保存到其变量,您可以通过angular.module(' mymod')访问模块:

// one file
// NOTE: the immediately invoked function expression 
// is used to exemplify different files and is not required
(function(){
   // declaring the module in one file / anonymous function
   // (only pass a second parameter THIS ONE TIME as a redecleration creates bugs
   // which are very hard to dedect)
   angular.module('mymod', []);
})();


// another file and/or another anonymous function
(function(){   
 // using the function form of use-strict...
 "use strict";
  // accessing the module in another. 
  // this can be done by calling angular.module without the []-brackets
  angular.module('mymod')
    .controller('myctrl', ['dep1', function(dep1){
      //..
    }])

  // appending another service/controller/filter etc to the same module-call inside the same file
    .service('myservice', ['dep2', function(dep2){ 
    //... 
    }]);

  // you can of course use angular.module('mymod') here as well
  angular.module('mymod').controller('anothermyctrl', ['dep1', function(dep1){
      //..
  }])
})();

不需要其他全局变量。

当然这完全取决于偏好,但我认为这是最好的做法,如

您不必污染全球范围 您可以随处访问您的模块,并随意将它们和它们的功能分类到不同的文件中 你可以使用"使用严格"的功能形式; 文件的加载顺序无关紧要 用于对模块和文件进行排序的选项

这种声明和访问模块的方式使您非常灵活。您可以通过功能类型(如另一个答案中所述)或通过路由对模块进行排序,例如:

/******** sorting by route **********/    
angular.module('home')...
angular.module('another-route')...
angular.module('shared')...

如何对它进行排序最终取决于个人品味以及项目的规模和类型。我个人喜欢将模块的所有文件分组到同一文件夹中(命令为指令,控制器,服务和过滤器的子文件夹),包括所有不同的测试文件,因为它使您的模块更可重用。因此,在中型项目中,我最终会得到一个基本模块,其中包括所有基本路由及其控制器,服务,指令以及或多或少复杂的子模块,当我认为它们对其他项目也有用时,例如:

/******** modularizing feature-sets **********/
/controllers
/directives
/filters
/services
/my-map-sub-module
/my-map-sub-module/controllers
/my-map-sub-module/services
app.js
...

angular.module('app', [
  'app.directives',
  'app.filters',
  'app.controllers',
  'app.services',
  'myMapSubModule'
]);

angular.module('myMapSubModule',[
   'myMapSubModule.controllers',
   'myMapSubModule.services',
   // only if they are specific to the module
   'myMapSubModule.directives',
   'myMapSubModule.filters'
]);

对于非常大的项目,我有时最终会按路线对模块进行分组,如上所述,或者通过一些选定的主要路线或甚至路线和一些选定组件的组合,但这实际上取决于。

编辑:仅仅因为它是相关的并且我最近再次遇到过:请注意你只创建一个模块一次(通过向angular.module函数添加第二个参数)。这会弄乱您的应用程序,并且很难检测到。

2015年关于排序模块的编辑:稍后一年半的角度体验,我可以补充说,在您的应用程序中使用不同命名模块的好处有些限制,因为AMD仍然无法与Angular和服务一起使用,指令和过滤器无论如何都在角度上下文中全局可用(如此处所示)。尽管如此,仍然存在语义和结构上的好处,并且可以包含/排除具有注释或注销的单行代码的模块。

按类型划分子模块几乎没有多大意义(例如,#my; myMapSubModule.controllers'),因为它们通常相互依赖。

答案 3 :(得分:0)

这种类型的函数调用称为立即调用函数。这提供了一个孤立的范围,不会污染全球范围。例如,在下面的代码中,TestController在全局范围内不可用。

(function(app){
   function TestContorller() {
   }

})(angular.module('myApp',[]))