Angular 可编辑配置
Angular editable config
我需要制作一个可以在应用构建后修改的配置文件。我正在尝试关注 this guide
现在我有 config-init.service.ts
import { Injectable } from '@angular/core';
import { Response } from "@angular/http";
import { UriConfig } from "../shared/models/uri-config.model";
import { HttpClient } from "@angular/common/http";
@Injectable({
providedIn: 'root'
})
export class ConfigInitService {
static settings: UriConfig;
load(): Promise<void> {
const file = 'assets/config/uris.json';
return new Promise<void>((resolve, reject) => {
this.http.get(file).toPromise().then((response: Response) => {
ConfigInitService.settings = <UriConfig>response.json();
console.log('Loading config');
resolve();
}).catch((err: any) => {
reject(`Could not load file "${file}": ${JSON.stringify(err)}`);
});
});
}
constructor(
private http: HttpClient
) {
}
}
在应用程序模块中
providers: [
...
ConfigInitService,
{
provide: APP_INITIALIZER,
useFactory: () => initializeApp,
deps: [ConfigInitService],
multi: true
}
]
})
export class AppModule {
}
export function initializeApp(uriConfig: ConfigInitService) {
console.log('app init');
return () => uriConfig.load();
}
根据控制台,应用程序初始化时正在使用工厂,但是没有来自 load
函数的控制台消息,也没有依赖于这些设置的工作服务。
您正在通过 initializeApp
函数将函数传递给 useFactory
,但是您可能有兴趣从 load
函数发送数据。您应该在 initializeApp
函数中进行小的更正,如 -
export function initializeApp(uriConfig: ConfigInitService) {
console.log('app init');
return uriConfig.load(); //<-- return the value from load function.
}
你能把promise部分移到函数里面吗?
load(): Promise<void> {
const file = 'assets/config/uris.json';
return () => {
return new Promise<void>((resolve, reject) => {
this.http.get(file).toPromise().then((response: Response) => {
ConfigInitService.settings = <UriConfig>response.json();
console.log('Loading config');
resolve();
}).catch((err: any) => {
reject(`Could not load file "${file}": ${JSON.stringify(err)}`);
});
});
}
}
解决者
import { Injectable } from '@angular/core';
import { UriConfig } from "../shared/models/uri-config.model";
import { HttpClient } from "@angular/common/http";
@Injectable({
providedIn: 'root'
})
export class ConfigInitService {
static settings: UriConfig;
load() {
}
constructor(
private http: HttpClient
) {
this.http.get('assets/config/uris.json').subscribe((file: UriConfig) => {
ConfigInitService.settings = file;
});
}
}
由于我的调查显示正在初始化服务,同时未调用函数,因此我在构造函数中放置了简单的 http GET 请求并获得了我需要的结果。
我需要制作一个可以在应用构建后修改的配置文件。我正在尝试关注 this guide
现在我有 config-init.service.ts
import { Injectable } from '@angular/core';
import { Response } from "@angular/http";
import { UriConfig } from "../shared/models/uri-config.model";
import { HttpClient } from "@angular/common/http";
@Injectable({
providedIn: 'root'
})
export class ConfigInitService {
static settings: UriConfig;
load(): Promise<void> {
const file = 'assets/config/uris.json';
return new Promise<void>((resolve, reject) => {
this.http.get(file).toPromise().then((response: Response) => {
ConfigInitService.settings = <UriConfig>response.json();
console.log('Loading config');
resolve();
}).catch((err: any) => {
reject(`Could not load file "${file}": ${JSON.stringify(err)}`);
});
});
}
constructor(
private http: HttpClient
) {
}
}
在应用程序模块中
providers: [
...
ConfigInitService,
{
provide: APP_INITIALIZER,
useFactory: () => initializeApp,
deps: [ConfigInitService],
multi: true
}
]
})
export class AppModule {
}
export function initializeApp(uriConfig: ConfigInitService) {
console.log('app init');
return () => uriConfig.load();
}
根据控制台,应用程序初始化时正在使用工厂,但是没有来自 load
函数的控制台消息,也没有依赖于这些设置的工作服务。
您正在通过 initializeApp
函数将函数传递给 useFactory
,但是您可能有兴趣从 load
函数发送数据。您应该在 initializeApp
函数中进行小的更正,如 -
export function initializeApp(uriConfig: ConfigInitService) {
console.log('app init');
return uriConfig.load(); //<-- return the value from load function.
}
你能把promise部分移到函数里面吗?
load(): Promise<void> {
const file = 'assets/config/uris.json';
return () => {
return new Promise<void>((resolve, reject) => {
this.http.get(file).toPromise().then((response: Response) => {
ConfigInitService.settings = <UriConfig>response.json();
console.log('Loading config');
resolve();
}).catch((err: any) => {
reject(`Could not load file "${file}": ${JSON.stringify(err)}`);
});
});
}
}
解决者
import { Injectable } from '@angular/core';
import { UriConfig } from "../shared/models/uri-config.model";
import { HttpClient } from "@angular/common/http";
@Injectable({
providedIn: 'root'
})
export class ConfigInitService {
static settings: UriConfig;
load() {
}
constructor(
private http: HttpClient
) {
this.http.get('assets/config/uris.json').subscribe((file: UriConfig) => {
ConfigInitService.settings = file;
});
}
}
由于我的调查显示正在初始化服务,同时未调用函数,因此我在构造函数中放置了简单的 http GET 请求并获得了我需要的结果。