Javascript变量名作为Json对象名
首先,问题的标题没有意义。我不知道怎样才能更好地问这个问题 我在一个8.1项目中面临一个问题。设置类中有一个我正在导入的josn文件(它是一个服务)。 当environment.ts文件中有一个变量作为app_company时。也可以使用与json文件相同的名称。因此,如果客户端app_公司与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
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
键创建一个包含每个.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
键创建一个包含每个.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的密钥。