我是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
。我知道我可以为A
和B
中的每一个都有函数,但由于潜在的工厂数量,我希望我只能使用一个创建函数,它将类型作为参数并根据创建新对象到了类型。
.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");
}])
答案 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);
};
}]);