AngularJs:如何使用IFFE声明应用程序和多个控制器,服务等?



John Papa著名的Angular 1 Style Guide建议使用IIFE,以避免var myApp = angular.module('myApp',[]); 之类的内容并污染全局命名空间。

给出的例子是:

logger.js

(function() {
'use strict';
angular
.module('app')
.factory('logger', logger);
function logger() { }
})();

storage.js

(function() {
'use strict';
angular
.module('app')
.factory('storage', storage);
function storage() { }
})();

这是怎么回事?我不需要至少声明一次模块吗?例如angular.module('app',[]);(封装在IIFE中?(而不是var app = angular.module('app',[]);以避免全局变量(?

然而,angular.module('app')在本例中的两种用法没有声明,而是将angular.module('app')求值两次,这肯定不是一件好事(事实上,我之前读到一个投票率很高的S.O.问题,说这是一件坏事,应该有一个引用,但那将是一个全局引用,也是一件坏事(。

是哪一个?或者,我可以在单独的文件中声明我的angular.module('app')以及一些控制器、服务、工厂、指令,在单独的IIFE中声明吗?如果是,如何?

我不需要至少声明一次模块吗?

是的,模块需要首先创建依赖项:

app.js

angular.module('app',['ngRoute']);

这必须在任何后续脚本添加到它之前完成。它不需要包含在IIFE中,因为它没有声明任何全局变量。

为了避免全局名称空间的污染,需要将以下内容包含在IIFE中:

logger.js

(function() {
'use strict';
angular
.module('app')
.factory('logger', logger);
function logger() { }
})();

另一方面

storage.js

'use strict';
angular.module('app')
.service('storage', function storage() {
var value;
this.get = function() { return value; };
this.set = function(val) {
value = val;
};
})

这不需要IIFE,因为它不声明任何全局变量或函数。

这两个示例都避免了污染全局命名空间。

有关更多信息,请参阅

  • AngularJS angular.module方法API参考

angular.module('app')没有数组作为第二个参数是getter,可以多次使用。

为了改进这一点,你需要一些构建工具,例如我们使用webpack(它将把所有东西都打包到u btw的IIFE中(,现在它看起来是这样的:

logger.js:

export default ['$log', function($log) {}]

storage.js:

export default ['$http', function($http) {}]

module.js:

import logger from './logger.js';
import storage from './storage.js';
angular
.module('app')
.factory('logger', logger)
.factory('storage', storage);

最新更新