我们有一个争论,我希望你们能帮忙解决。
假设我有一个像这样定义的简单工厂:
angular.module('myModule', [])
.factory('Fact', function() {
var Fact = function() {
var that = {};
that.var1 = [];
that.var2 = [];
return that;
};
var fact = {
get: function() {
return Fact();
}
};
return fact;
});
我发现如果我这样编写代码将会有效:
angular.module('myModule', [])
.factory('Fact', function() {
var fact = {
get: function() {
return Fact();
}
};
return fact;
});
var Fact = function() {
var that = {};
that.var1 = [];
that.var2 = [];
return that;
};
即,我可以使用对象Fact
的此代码并将其放在其他普通.js
文件中,将其包含在Angular之前(在index.html
文件中)和此& #34;会工作"。
但是,我试图解决这种方法并不好的论点(好吧,不是Angular的方法),因为那时Fact
是"围绕全球范围& #34;,这不好。
在哪种情况下你会说这不是一个好的解决方案?
有没有办法包含" nonAngular"代码(用一些.js
文件编写的简单JavaScript代码)到Angular工厂?
答案 0 :(得分:2)
在工厂,服务,提供商,常数和价值观之间,在Angular的构造之外有任何代码并不是一个很好的理由,除非它是第三派对代码。
如果是,您将无法控制库,框架等自我注册的方式。它可能使用全局范围,或者它可能提供模块导出。
在可能的情况下,在Angular中包含第三方代码的最简洁,最安全的方法是使用模块捆绑器构建步骤。
例如,我想使用browserify从Angular内部使用假设包foojs
:
使用npm
安装软件包npm install --save foojs
然后像这样使用它。
var foojs = require('foojs');
var app = angular.app('myapp')
app.service('myservice', function() {
// here we can use foojs safely
});
您还可以使用WebPack实现类似的功能。
这更安全的原因是因为在构建步骤之后,所有模块都将被包装在一个保护全局范围的函数中。
如果您无法使用模块捆绑包,那么唯一的选择是使用全局范围并允许第三方代码绑定到窗口对象。