将Angular生态系统之外定义的对象包含到工厂中

时间:2015-11-20 11:27:35

标签: javascript angularjs

我们有一个争论,我希望你们能帮忙解决。

假设我有一个像这样定义的简单工厂:

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工厂?

1 个答案:

答案 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实现类似的功能。

这更安全的原因是因为在构建步骤之后,所有模块都将被包装在一个保护全局范围的函数中。

如果您无法使用模块捆绑包,那么唯一的选择是使用全局范围并允许第三方代码绑定到窗口对象。