如何以自定义标识符为变量名创建变量?动态服务注入需求
动态注入服务并生成对应变量的解决方案
我懂你想要实现的效果——不用手动挨个写服务注入语句,而是根据数组里的服务名称,自动创建对应的变量并完成注入对吧?你原来的写法在JavaScript里是语法错误的,var arr[i]这种声明变量的方式根本不合法,不过我们有几种实用的方案来达成你的需求:
方案一:将服务挂载到对象上(推荐)
这种方式不会污染当前作用域,结构清晰还便于维护,是最稳妥的做法:
// 先创建一个容器对象来存放所有动态注入的服务 const injectedServices = {}; $rootScope.arr = ['MasterLookupService', 'PrinterService']; for (let i = 0; i < $rootScope.arr.length; i++) { const serviceName = $rootScope.arr[i]; // 通过对象属性的动态赋值来关联服务名和实例 injectedServices[serviceName] = $injector.get(serviceName); } // 后续访问示例: // injectedServices.MasterLookupService.doSomething(); // injectedServices['PrinterService'].print();
方案二:在指定作用域创建变量(谨慎使用)
如果你确实需要直接在作用域里使用服务名称作为变量名,得根据当前的作用域上下文来处理:
情况1:在AngularJS控制器(controllerAs语法)中
$rootScope.arr = ['MasterLookupService', 'PrinterService']; for (let i = 0; i < $rootScope.arr.length; i++) { const serviceName = $rootScope.arr[i]; // 控制器实例的this会被绑定到视图的vm(或你指定的别名)上 this[serviceName] = $injector.get(serviceName); } // 控制器内访问:this.MasterLookupService // 视图中访问:vm.MasterLookupService(假设controllerAs: 'vm')
情况2:使用$scope的控制器中
$rootScope.arr = ['MasterLookupService', 'PrinterService']; for (let i = 0; i < $rootScope.arr.length; i++) { const serviceName = $rootScope.arr[i]; // 把服务挂载到$scope上,视图和控制器内都能访问 $scope[serviceName] = $injector.get(serviceName); } // 控制器内访问:$scope.MasterLookupService // 视图中访问:{{MasterLookupService}}
情况3:全局作用域(不推荐)
$rootScope.arr = ['MasterLookupService', 'PrinterService']; for (let i = 0; i < $rootScope.arr.length; i++) { const serviceName = $rootScope.arr[i]; // 直接挂载到window对象,成为全局变量 window[serviceName] = $injector.get(serviceName); } // 任意地方直接访问:MasterLookupService
注意:直接在作用域创建变量容易造成命名冲突,尤其是全局作用域,所以除非有特殊需求,优先选择方案一。
内容的提问来源于stack exchange,提问作者spacedev
相关产品推荐
相关产品推荐

