Angularjs 定义角模的不同方法

Angularjs 定义角模的不同方法,angularjs,Angularjs,所以今天我在网上搜索,发现了一些有趣的东西。通常我这样定义角模 var app = angular.module('myApp',[]); app.controller('myCtrl',function($scope){ //some code }) angular.module('myApp',[]) .controller('myCtrl',function($scope){ //some code }) 甚至像这样 var app = angular.m

所以今天我在网上搜索,发现了一些有趣的东西。通常我这样定义角模

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

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',[]))

那么这些初始化之间有什么不同呢。有没有最有效的方法。我试图在互联网上搜索,但找不到解决方案。谢谢大家

区别在于:

var app = angular.module('myApp',[]);
app.controller('myCtrl',function($scope){ 
//some code
})
这里您的
应用程序
是一个全局变量。您可以从任何地方访问
应用程序
。必须避免才能创建全局变量

angular.module('myApp',[])
    .controller('myCtrl',function($scope){ 
    //some code
    })
这段代码也很好。你没有任何全局变量。在这里,你需要在一行代码中创建module的组件。因此,如果你需要访问你的模块,你需要使用
angular.module('myApp')
。这是一个很好的变体,但不是最好的

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

(function(app){

})(angular.module('myApp',[]))
这是最好的变体。您正在创建,即-创建一个函数并立即调用它,并将
模块作为参数传递
app
现在只在函数中可见,不会污染全局空间

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

对评论的回答:
当然可以

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

(function(app){

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

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

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

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

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

声明模块的“最佳”方法

由于angular位于全局作用域本身,并且模块保存在其变量中,因此您可以通过angular.module('mymod')访问模块:

不需要其他全局变量

当然,这完全取决于偏好,但我认为这是一种最佳实践,正如

你不必污染全球范围 你可以在任何地方访问你的模块,并随意将它们和它们的功能分类到不同的文件中 您可以使用“使用严格”的函数形式; 文件的加载顺序并不重要 用于对模块和文件进行排序的选项

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

/******** 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年分类模块编辑:一年半的angular经验之后,我可以补充一点,在你的应用程序中使用不同名称的模块的好处是有限的,因为AMD仍然不能很好地使用angular,而且angular上下文中的服务、指令和过滤器都是全球可用的(如这里的例子所示)。尽管如此,在语义和结构上仍然有好处,并且能够包含/排除带有注释的单行代码的模块可能会有所帮助


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

第一和第二声明没有任何重大区别。建议使用第三个选项

  • 您只需保存angular module setter方法的返回值,并通过一个全局变量重用它

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

  • 这里我们使用angular的getter语法,它将返回模块引用。getter语法与立即调用函数表达式(IIFE)一起确保您不会污染全局命名空间。这是编写控制器、服务等的首选方法

  • 有关AngularJS的最佳实践,请参阅John Papa的AngularJS样式指南

    谢谢@Suren Srapyan。我的控制器在单独的js文件中。到目前为止,我使用了第一个场景。因为在场景2中,我必须为每个控制器文件重新定义相同的模块。有没有办法使用场景3来分离js文件