Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript变量名作为Json对象名_Javascript_Angular_Typescript - Fatal编程技术网

Javascript变量名作为Json对象名

Javascript变量名作为Json对象名,javascript,angular,typescript,Javascript,Angular,Typescript,首先,问题的标题没有意义。我不知道怎样才能更好地问这个问题 我在一个8.1项目中面临一个问题。设置类中有一个我正在导入的josn文件(它是一个服务)。 当environment.ts文件中有一个变量作为app_company时。也可以使用与json文件相同的名称。因此,如果客户端app_公司与json文件匹配。应该从该文件加载所有配置。这就是我需要实现的目标 到目前为止,我所尝试的是 import { Injectable } from '@angular/core'; import { env

首先,问题的标题没有意义。我不知道怎样才能更好地问这个问题

我在一个8.1项目中面临一个问题。设置类中有一个我正在导入的josn文件(它是一个服务)。 当environment.ts文件中有一个变量作为app_company时。也可以使用与json文件相同的名称。因此,如果客户端app_公司与json文件匹配。应该从该文件加载所有配置。这就是我需要实现的目标 到目前为止,我所尝试的是

import { Injectable } from '@angular/core';
import { environment } from '@env/environment';
import * as client1 from './client1.json';



@Injectable({
  providedIn: 'root'
})
export class SettingsService {

  newInstance:object;

  constructor() { }

  config(key : string){

    //  const newInstance = Object.create(window[environment.app_company].prototype);
    //  newInstance.constructor.apply(newInstance);
    //  return newInstance.key;
    //  const newInstance: any = new (<any>window)[environment.app_company];
    // console.log(Object.create(window[environment.app_company]));

     return environment.app_company.key;
  }
}
因此,如果我调用
client1.opNumberLabel

它像我期望的那样工作,但我试图让它像
environment.app\u company.key
那样动态,它不工作

正如您所看到的,我的已试过的评论到目前为止尚未工作:(

任何暗示都将不胜感激。
提前感谢,

您想实现这样的目标吗

import { Injectable } from '@angular/core';
import * as settings from "./environment.json";

interface Settings {
  [key: string]: string
}

type Environment = {
  [key: string]: Partial<Settings>
};

@Injectable({
  providedIn: 'root'
})
export class SettingsService {

  private environment: Environment = {
    app_company: { }
  };

  constructor() {
    this.environment.app_company = settings;
    console.log(this.config("opNumberLabel")); // OP No
  }

  config(key : string){
     return this.environment.app_company[key];
  }
}
如果您希望将app_company也作为一个动态值,那么我建议扩展该示例:

  • 通过创建一个
    init
    函数,该函数也可以接受
    客户端
  • 通过将对象传递给
    设置服务
    构造函数,使用
    InjectionToken
    ,因此您可以定义 您正在尝试配置的当前客户端
您可能还希望为不同的客户机设置不同的环境,因此我建议为每个客户机创建单独的环境json文件。 您可以使用
键创建一个包含每个
.environment.json
的对象

然后你有一个对象,像这样:

const clientEnvironments: Environment = {
    client1: { ... },
    client2: { ... }
};

因此,通过拥有当前客户端的名称,您可以轻松地选择要使用的环境。

您想实现类似的目标吗

import { Injectable } from '@angular/core';
import * as settings from "./environment.json";

interface Settings {
  [key: string]: string
}

type Environment = {
  [key: string]: Partial<Settings>
};

@Injectable({
  providedIn: 'root'
})
export class SettingsService {

  private environment: Environment = {
    app_company: { }
  };

  constructor() {
    this.environment.app_company = settings;
    console.log(this.config("opNumberLabel")); // OP No
  }

  config(key : string){
     return this.environment.app_company[key];
  }
}
如果您希望将app_company也作为一个动态值,那么我建议扩展该示例:

  • 通过创建一个
    init
    函数,该函数也可以接受
    客户端
  • 通过将对象传递给
    设置服务
    构造函数,使用
    InjectionToken
    ,因此您可以定义 您正在尝试配置的当前客户端
您可能还希望为不同的客户机设置不同的环境,因此我建议为每个客户机创建单独的环境json文件。 您可以使用
键创建一个包含每个
.environment.json
的对象

然后你有一个对象,像这样:

const clientEnvironments: Environment = {
    client1: { ... },
    client2: { ... }
};
因此,通过拥有当前客户端的名称,您可以轻松选择要使用的环境。

最后我解决了这个问题

export class SettingsService {

  clients = { client1 , client2  };
  app_company :string;
  default_client = 'client1';

  constructor() { }

  config(label : string){

      this.app_company = environment.app_company;
      if(this.clients[this.app_company].default.hasOwnProperty(label)){
        return this.clients[this.app_company].default[label];
      }else{
        return this.clients[this.default_client].default[label];
      }


  }
}
多亏了@Titus的提示。

我终于决定了

export class SettingsService {

  clients = { client1 , client2  };
  app_company :string;
  default_client = 'client1';

  constructor() { }

  config(label : string){

      this.app_company = environment.app_company;
      if(this.clients[this.app_company].default.hasOwnProperty(label)){
        return this.clients[this.app_company].default[label];
      }else{
        return this.clients[this.default_client].default[label];
      }


  }
}

感谢@Titus的提示。

似乎您不想使用字符串变量访问对象的属性,您可以这样做:
client1[environment.app_company.key]
No,问题是client1也是动态的,就像env app_company值是client1,client2等您可以将所有客户端存储在一个对象中:
const clients={client1,client2,client3}
并使用括号表示法访问相应的一个:
客户端[env.app_company]
@Titus我尝试过这种方法,似乎client1无法访问key。似乎您不想使用字符串变量访问对象的属性,您可以这样做:
client1[environment.app_company.key]
No,问题是client1也是动态的,就像env-app\u公司值是client1,client2等。您可以将所有客户端存储在一个对象中:
const-clients={client1,client2,client3}
并使用括号表示法访问相应的:
clients[env.app\u公司]
@Titus我尝试过这种方式,但似乎无法访问客户端1的密钥。