在Angular JS

时间:2015-09-14 14:12:58

标签: javascript angularjs

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

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

这是一个工厂的例子

.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中的每一个都有函数,但由于潜在的工厂数量,我希望我只能使用一个创建函数,它将类型作为参数并根据创建新对象到了类型。

   .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是函数,但我收到错误window[type] is not a function

解: 感谢@Claies的建议,更新我的服务如下并且有效!

    .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");
    }])

3 个答案:

答案 0 :(得分:1)

You can use the $injector if you want to instantiate providers by their name (providing their name as a string).

.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;
  }

}])

Here is a working sample: http://plnkr.co/edit/t4ILB4CV11Lni8pLGQ9j

答案 1 :(得分:0)

使用service而非factory

.service('A', function(){

后来的代码错了。我甚至猜不出你要做什么。服务/工厂只有一个实例。

答案 2 :(得分:0)

.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);
  };
}]);