angular - 将本地JSON文件映射为键值对数组

标签 angular

通常,人们希望根据用户的选择使用不同的值集。例如,根据所选语言,同一事物有不同的表达方式,或者根据所选主题,同一类型的不同颜色。我目前正在尝试执行后者,因此我制作了几个具有相同键但不同值的 JSON 文件。这是“green_theme”JSON:

{
  "darker_color": "#1a3300",
  "lighter_color": "#4f9900",
  "error_color": "#b42805"
}

现在我希望组件从注入(inject)的服务中获取它们所需的颜色代码,如下所示:

<div [style.color]="themeService.getColorCodeByKey('darker_color')">example</div>

这就是我尝试实现该服务的方式:

@Injectable()
export class ThemeService {
    private readonly RED_SKIN_SOURCE = "assets/themes/red_skin.json"
    private readonly GREEN_SKIN_SOURCE = "assets/themes/green_skin.json" 
    private readonly YELLOW_SKIN_SOURCE = "assets/themes/green_skin.json"
    public skinData: {[key: string]: string} = {};

constructor(private http:Http) {
    this.setSkin(ThemeService.Skin.Green);
}

getColorCodeByKey(key: string): string {
    return this.skinData[key];
}

public setSkin(skin: ThemeService.Skin) {
    let observable: Observable<Response>;
    switch(skin) {
        case ThemeService.Skin.Red: {
            observable =  this.http.get(this.RED_SKIN_SOURCE);
            break;
        }
        case ThemeService.Skin.Yellow: {
            observable =  this.http.get(this.YELLOW_SKIN_SOURCE);
            break;
        }
        case ThemeService.Skin.Green: {
            observable =  this.http.get(this.GREEN_SKIN_SOURCE);
            break;
        }
    }

    observable.map((res: Response) => res.json().forEach(element => {
        this.skinData[element.key] = element;
    }));
  }
}
export namespace ThemeService {
    export enum Skin {
        Red, 
        Green,
        Yellow
    }
}

但似乎 setSkin 方法将 skinData 留空?如何正确地做到这一点?我是否太早映射 Observable 了?或者这不是 .json() 的工作原理?

或者,如果您有更好的想法如何实现这种类似键值的服务,我并不反对放弃 JSON.. 我什至考虑以自己的方式用自己的格式实现它,解析器

最佳答案

要修复当前的解决方案,您需要订阅 observable:

observable.subscribe((res: any) => { this.skinData = res; });

Angular 中的 HttpClient 默认解析 json 响应(与 fetch 不同),并返回解析后的 SkinData,你可以立即使用它。

关于angular - 将本地JSON文件映射为键值对数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51856502/

相关文章:

angular - 找不到模块'node-sass

angular - 无法在 Angular 2 中的 *ngFor 中找到变量

javascript - 是否可以使用 TypeScript 将 HTML 文件作为字符串导入?

angular - 在任何按钮上单击内部关闭 Angular Material sidenav

javascript - 如何通过 Angular2 使用 REST API?

Angular2 rc5 : No provider for Http

android - 如何显示 Cordova PhotoLibrary 返回的图像?

angular - 获取将由 router.navigate 生成的 URL

css - 问答 - Angular CLI : Using CSS preprocessors globally

Angular 2 ADAL token 刷新,用于隐式流程(使用 "adal-angular4")