关于 javascript:在 Angular JS 中按名称调用工厂

Call a factory by name in Angular JS

我是 js 新手。我有一个大型网络应用程序,可能会有十多个工厂。

这是我的代码。所有工厂和服务都在同一个模块中

这里是工厂的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
.factory('A', function(){
        return function A(){
           this.number;
           this._id= new Date().getTime();
           this.type ="A";
        };
    }).factory('B', function(){
        return function B(){
        this.type="B";
        this.number;
        this._id= new Date().getTime();
        };
    })

我有一个创建工厂对象新实例的服务。 addUnit() 函数实际上映射到用户点击,所以 type 可能是 A,可能是 B。我知道我可以为 AB 中的每一个都有函数,但是由于工厂的潜在数量,我希望我可以只使用一个以类型为参数并根据类型创建新对象的创建函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
   .service('myService', ['A','B',
    function(A, B){    
        this.addUnit = function(type) {
            console.log(typeof A);
            var myUnit = new window[type]({   //ERROR!!
                'number' : 3,
            });

            return myUnit;
        }

        addUnit("A");
}])

然而,控制台可以打印出 typeof A is function,但我得到一个错误 window[type] is not a function.

解决方案:
感谢@Claies \\' 的建议,更新了我的服务,如下所示!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    .service('myService', ['A','B',
         function(A, B){    
          var $injector = angular.injector(['moduleName','ng']);
            this.addUnit = function(type) {
                console.log(typeof A);
                var myUnitFunc = $injector.get(type);
                var myUnit = new myUnitFunc({
                  'number' : 3,
                });

                return myUnit;
            }

           addUnit("A");
    }])


如果你想通过他们的名字来实例化提供者(提供他们的名字作为一个字符串),你可以使用 $injector

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.service('myService', ['$injector', function($injector) {

  this.addUnit = function(type) {

    var instance;

    if ($injector.has(type))
    {
      var typeConstructor = $injector.get(type);
      instance = new typeConstructor();
      instance.number = 3;
    }

    return instance;
  }

}])

这是一个工作示例:http://plnkr.co/edit/t4ILB4CV11Lni8pLGQ9j


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.constant('A', function A(number) {
  this._id = Date.now();
  this.type ="A";
  this.number = number;
})
.constant('B', function B(number) {
  this._id = Date.now();
  this.type ="B";
  this.number ="number";
})

.service('myService', ['A', 'B', function (A, B) {
  var constructors = {A:A, B:B};

  this.addUnit = function (type) {
    var C = constructors[type];
    return C && new C(3);
  };
}]);

使用 service 而不是 factory.

1
.service('A', function(){

而且后面的代码是错误的。我什至无法猜测你要做什么。只有一个服务/工厂实例。