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(); }; }) |
我有一个创建工厂对象新实例的服务。
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"); }]) |
然而,控制台可以打印出
解决方案:
感谢@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"); }]) |
如果你想通过他们的名字来实例化提供者(提供他们的名字作为一个字符串),你可以使用
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); }; }]); |
使用
1 | .service('A', function(){ |
而且后面的代码是错误的。我什至无法猜测你要做什么。只有一个服务/工厂实例。