AngularJS模块声明的最佳实践?

前端之家收集整理的这篇文章主要介绍了AngularJS模块声明的最佳实践?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一堆Angular模块在我的应用程序中声明。我最初开始声明他们使用“链式”语法如下:
angular.module('mymodule',[])
    .controller('myctrl',['dep1',function(dep1){ ... }])
    .service('myservice',['dep2',function(dep2){ ... }])
    ... // more here

但我决定不是很容易阅读,所以我开始声明他们使用一个模块变量这样:

var mod = angular.module('mymodule',[]);

mod.controller('myctrl',function(dep1){ ... }]);

mod.service('myservice',function(dep2){ ... }]);
...

第二种语法似乎对我来说更多的可读性,但我唯一的抱怨是这种语法将mod变量留在全局范围。如果我有一个名为mod的其他变量,它将被下一个(以及与全局变量相关的其他问题)覆盖。

所以我的问题是,这是最好的方法吗?或者最好做这样的事情:

(function(){
    var mod = angular.module('mymod',[]);
    mod.controller('myctrl',function(dep1){ ... }]);
    mod.service('myservice',function(dep2){ ... }]);
    ...
})();

或者甚至足够关心吗?只是想知道什么“最佳实践”是模块声明。提前致谢。

‘最好的’方式声明一个模块

由于角度在全局范围本身,模块保存到其变量,您可以通过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',function(dep1){
      //..
    }])

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

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

不需要其他全局变量

当然,这取决于喜好,但我认为这是一种最好的做法,因为

>你不必污染全局范围
>您可以随时访问您的模块,并将它们及其功能分类到不同的文件
>你可以使用“use strict”的函数形式;
>文件的加载顺序并不重要

用于排序模块和文件的选项

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

/******** 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仍然不能真正工作良好的角度和服务,指令和过滤器是全球可用的角上下文(as exemplified here)。仍然有一个语义和结构的好处虽然,它可能是有用的能够包括/排除模块与一行代码注释或注释。

它也几乎从来没有什么意义,按照类型(例如’myMapSubModule.controllers’)分离子模块,因为它们通常依赖于彼此。

原文链接:https://www.f2er.com/angularjs/147218.html

猜你在找的Angularjs相关文章