我的应用程序中声明了一堆Angular模块。我最初开始使用“链式”语法声明它们,如下所示:
angular.module('mymodule', [])
.controller('myctrl', ['dep1', function(dep1){ ... }])
.service('myservice', ['dep2', function(dep2){ ... }])
... // more here
但是我认为这不太容易阅读,所以我开始使用如下模块变量来声明它们:
var mod = angular.module('mymodule', []);
mod.controller('myctrl', ['dep1', function(dep1){ ... }]);
mod.service('myservice', ['dep2', function(dep2){ ... }]);
...
第二种语法对我来说似乎更具可读性,但我唯一的抱怨是该语法将mod
变量保留在全局范围之外。如果我有其他名为的变量mod
,它将被下一个变量覆盖(以及与全局变量相关的其他问题)。
所以我的问题是,这是最好的方法吗?还是做这样的事会更好?
(function(){
var mod = angular.module('mymod', []);
mod.controller('myctrl', ['dep1', function(dep1){ ... }]);
mod.service('myservice', ['dep2', function(dep2){ ... }]);
...
})();
还是足够重要呢?只是想知道模块声明的“最佳实践”是什么。提前致谢。
声明模块的“最佳”方法
由于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-
function添加第二个参数)。这会使您的应用程序混乱,并且很难检测。
2015年对排序模块的编辑:
一年半的经验之后,我可以补充一点,因为在AMD中仍然不能很好地与Angular以及服务,指令和过滤器配合使用,因此在您的应用程序中使用命名不同的模块所带来的收益有限无论如何都可以在角度上下文中全局使用。但是,仍然存在语义和结构上的好处,并且能够包含/排除带有注释掉或注释掉一行代码的模块可能会有所帮助。
由于 子模块 通常彼此依赖,因此 按类型分隔子模块 (例如,“ myMapSubModule.controllers”)几乎也没有多大意义 。
use 声明可以将一个完整的路径绑定到一个新的名字,从而更容易访问。 // 将 `deeply::nested::function` 路径绑定到 `other_function`。 use deeply::nested::function as other_function; fn function() { println!("called `function()`"); } mod de
问题内容: 我正在阅读 http://www.alexrothenberg.com/2013/02/11/the-magic-behind-angularjs- dependency-injection.html ,事实证明,如果您缩小JavaScript的大小,angularjs依赖项注入会出现问题,我想知道是否 你应该使用 总而言之,我认为第二个片段是针对angularjs的旧版本的,但是..
问题内容: 有没有办法列出为给定的角度模块定义的所有指令和控制器?例如,假设我在’main’模块中定义了三个控制器(即angular.module(’main’)。controller(’MainCtrl’,function(){…})。是否有办法获取列表的那三个控制器? 问题答案: 嗯,真的很难,我认为不是一件好事,但是: _invokeQueue是一个数组,如果您对每个获得[0] [2] [1
我正在创建一个环境模块来补充缺失的打字。我可以创建打字。d、 ts这为环境模块提供了正确的类型。 由于某种原因,当我这样做时,环境模块的import语句中断。 typings.d.ts 在上面的例子中,我想从另一个库中提供适当的返回类型。
问题内容: 我只想在多个地方使用a :不仅是视图和控制器,而且还包括和其他配置文件。 我不想要这样的事情:使用Config类加载配置文件;使用CI 等。 我只想声明一个给定的(它可以是一个常数,但我需要将它作为一个变量),并在所有地方绝对使用它。 实际上…我想知道CI引导程序中哪个PHP文件是第一个要解析的文件,因此我可以在其中引入我的全局变量…但不是核心/系统或不适当的文件,而是“最佳”适合此简
问题内容: 我的角度应用程序有2个控制器。我的问题是,当用户离开页面时,控制器不会保留数据。 如何将所选控制器上的选定数据存储到数据存储中,以便可以在其他控制器之间使用? 问题答案: 选项1-自定义 您可以利用专用的角度服务在控制器之间存储和共享数据(服务是单实例对象) 服务定义 在多个控制器中的用法 选项2-HTML5 您可以使用内置的浏览器本地存储并从任何地方存储数据 写作 读 看看这个很棒的