AngularJs : 如何使用 IFFE 声明一个应用程序和多个控制器、服务等?
AngularJs : How to declare an app & multiple controllers, serves, etc, using an 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')
,加上一些控制器、服务、工厂、指令,在单独的 IIFEs 中吗?如果可以,怎么做?
angular.module('app')
没有数组,因为第二个参数是getter,可以多次使用它。
要改进这一点,您需要一些构建工具,例如我们使用 webpack(顺便说一句,它会将所有内容包装到 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);
Do I not need to declare the module at least once?
是的,需要先创建带有依赖关系的模块:
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 因为它没有声明任何全局变量或函数。
两个示例都避免了污染全局命名空间。
有关详细信息,请参阅
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')
,加上一些控制器、服务、工厂、指令,在单独的 IIFEs 中吗?如果可以,怎么做?
angular.module('app')
没有数组,因为第二个参数是getter,可以多次使用它。
要改进这一点,您需要一些构建工具,例如我们使用 webpack(顺便说一句,它会将所有内容包装到 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);
Do I not need to declare the module at least once?
是的,需要先创建带有依赖关系的模块:
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 因为它没有声明任何全局变量或函数。
两个示例都避免了污染全局命名空间。
有关详细信息,请参阅