APP_INITIALIZERを使用して、構成ファイルからデータをロードしようとしています。私は次のエラーが発生しています:
「処理されていないPromiseの拒否:this.appInits [i]は関数ではありません;ゾーン:;タスク:Promise.then;値:TypeError:this.appInits [i]は関数ではありません」
コード:
import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import { Observable } from 'rxjs/Rx';
@Injectable()
export class ApiConfig {
private urlList: any = null;
constructor(private http: Http) {
}
public getUrl(key: any) {
return this.urlList[key];
}
public loadConfig(){
let retPromise: Promise<any> = this.http.get('./assets/config/api-config.json')
.map(res => res.json()).toPromise();
retPromise.then(resp => this.urlList=resp.urlList);
//this.urlList = retPromise.urlList;
return retPromise;
}
}
export function apiConfigProvider(config: ApiConfig) {
config.loadConfig();
}
私が間違っていることの助けはありますか?
編集:
Adamのソリューションは元のエラーを修正しました。しかし、今、新しいエラーが表示されます:
TypeError:未定義のプロパティ「urlList」を設定できません
私が理解したように、ApiConfigのインスタンスは作成されていません。しかし、Angularの設定ファイルをロードする際に見たすべての例は、同じ例を示します。ApiConfigクラスを強制的に作成する方法を疑問に思います。どうすればそれをシングルトンにできますか? ApiConfigの。
export BaseService {
constructor (private config:ApiConfig){}
public GetUrl (key: string) {
return config.urlList[key];
}
}
Answer:上記のコードでpromiseを作成する方法に問題があるようです。リンクで指定されているようにloadconfig()メソッドを変更しました: https://Gist.github.com/fernandohu/122e88c3bcd210bbe41c608c36306db9 これで問題が解決しました。
これは、エクスポート関数ステートメントで関数を返す必要があるためだと思います。
export function apiConfigProvider(config: ApiConfig) {
return () => config.loadConfig();
}