创建可注入类(构造函数)

Nil*_*lsH 17 javascript angularjs

我是一个新手AngularJS,和我刚开始理解的概念和区别factory,servicecontroller.据我所知,a factory用于返回可以注入的"值对象".我见过的大多数例子都是这样的:

angular.module('module.factories', function() {
    factory('FactoryObject', function() {
        return {
            someFunction: function(someParam) {};
            someOtherFunction: function(someOtherParam) {});
        };
    });
});
Run Code Online (Sandbox Code Playgroud)

在我controller,我希望能够使用这个对象,但我想在控制器中初始化/实例化它,因为它可以根据控制器中的事件/动作重新初始化.因此,我想知道我是否可以在工厂中返回构造函数?

angular.module('module.factories', function() {
    factory('FactoryObject', function() {

        function FactoryObject(initParam) {
        }

        FactoryObject.prototype.someFunction = function() {};

        return FactoryObject;

    });
});
Run Code Online (Sandbox Code Playgroud)

这是一个角度工厂的合适模式吗?或者将工厂用于这样的自定义对象只是"过度杀伤"?我应该将它包含在库js文件中并从那里引用它吗?将它放入工厂的一个好处是可以很容易地在测试中模拟它,因为它将被注入到使用它的地方.是否可以使用Angular中的其他任何机制?

Foo*_*o L 8

我有同样的问题.这是我实施的内容:

angular.module('foo', [])
.factory('Foo', ['$http', function($http) {
  return function(a, b) {
    this.arr = [];
    this.a = a;
    this.b = b;
    this.random = Math.floor(Math.random()*11);

    this.someFunc = function(c) {
      this.arr.push(c);
    };
  };
}]);
Run Code Online (Sandbox Code Playgroud)

现在,我可以这样做:

var f1 = new Foo('A', 'B');
f1.random;  // i.e. 0
f1.someFunc('z');  // only affects f1.arr
var f2 = new Foo('C', 'D');
f2.random;  // i.e. 8
f2.someFunc('y');  // only affects f2.arr
Run Code Online (Sandbox Code Playgroud)

使事情更加模块化.希望有所帮助.


hon*_*n2a 3

你说得很对,这就是创建可注入“类”(构造函数)的方法。然而,factory只有当你需要注入其他东西供你的类使用时,才需要使用:

.factory('Class', ['$q', function ($q) {
    function Class () {}
    Class.prototype = {
        constructor: Class,
        doSomeAsyncAction: function () {
            return $q(function (resolve, reject) {
                // ...
            });
        },
        // ...
    };
    return Class;
})
Run Code Online (Sandbox Code Playgroud)

如果您正在创建一个完全独立的类(例如某些数据结构),您可以只使用constant,这样您的类即使在服务提供者中也可用:

(function (undefined) {
    function Class () {}
    Class.prototype = { ... };
    angular.module(...)
        .constant('Class', Class);
})();
Run Code Online (Sandbox Code Playgroud)

作为旁注,使用provider不会对您有帮助。提供程序服务于完全不同的目的,并且(除其他外)返回一个工厂函数,然后在第一次请求的注入时使用该函数来创建服务的单个实例。提供程序用于让您在应用程序构建的_配置阶段_配置单个服务实例(请参阅文档)。