You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以自定义标识符为变量名创建变量?动态服务注入需求

动态注入服务并生成对应变量的解决方案

我懂你想要实现的效果——不用手动挨个写服务注入语句,而是根据数组里的服务名称,自动创建对应的变量并完成注入对吧?你原来的写法在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:23:54