所以今天我通过互联网搜索我发现了一些有趣的东西。通常我会像这样定义角度模块
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',[]))
那么初始化之间有什么不同呢。是最有效的方式。我尝试通过互联网搜索,但无法找到解决方案。谢谢你们
答案 0 :(得分:3)
第一&第二次声明没有任何重大差异。建议使用第三种方案。
您只是保存角度模块设定器方法的返回值,并通过全局变量重新使用它。
我们不是使用全局变量来存储模块引用,而是直接在返回值上声明控制器。此模式称为“方法链”
有关角度的最佳实践,请查看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',[]))