Я работаю с Angular2 RC5. Я хочу, чтобы загрузить мой IP-адрес сервера и некоторые другие параметры конфигурации до загрузки моего приложения. Как я могу сделать это в последнем RC5?
Я видел другие статьи, но они не помогают:
- Как предварительно загрузить файл конфигурации в angular2: здесь приведен конкретный ответ на webpack. Я использую systemjs.
- https://medium.com/@hasan.hameed/reading-configuration-files-in-angular-2-9d18b7a6aa4#.m8lontnas: Это для старой версии Angular2. Некоторые из используемых классов устарели.
Любая помощь будет принята с благодарностью.
Edit
Я попытался использовать APP_INITIALIZER следующим образом в своем приложении .module.ts:
import { NgModule, provide, APP_INITIALIZER } from "@angular/core";
import { ConfigService } from "./shared/services/config.service";
@NgModule({
declarations: [AppComponent],
imports: [BrowserModule,
routes,
FormsModule,
HttpModule],
providers: [AuthService,
Title,
appRoutingProviders,
ConfigService],
bootstrap: [AppComponent
, provide(APP_INITIALIZER,
{
useFactory: (config: ConfigService) => () => config.load(),
deps: [ConfigService], multi: true
})]
})
export class AppModule { }
Это мой файл config.service.ts:
import { Config } from "../model/config";
export class ConfigService {
constructor() {
}
load(): Promise<Config> {
let config: Config = new Config("localhost", "5050");
return Promise.resolve(config);
}
}
Обратите внимание, что я в конечном итоге переписал бы нагрузку, чтобы на самом деле прочитать свойство или какой-либо такой файл для загрузки конфигурации.
Вот что выглядит config.ts:
export class Config {
constructor(
private machine: string,
private port: string
) {
}
private base_url: string = "http://" + this.machine +
this.port + "/";
public loginURL: string = this.base_url + "login";
}
Я получаю ошибку компиляции
public/app/app.module.ts(27,11): error TS2345: Argument of type '{ declarations: (typeof AppComponent ...' is not assignable to parameter of type 'NgModuleMetadataType'.
Types of property 'bootstrap' are incompatible.
Type '(typeof AppComponent | Provider)[]' is not assignable to type '(Type | any[])[]'.
Type 'typeof AppComponent | Provider' is not assignable to type 'Type | any[]'.
Type 'Provider' is not assignable to type 'Type | any[]'.
Type 'Provider' is not assignable to type 'any[]'.
Property '[Symbol.iterator]' is missing in type 'Provider'.
Изменить 2
Я перехожу к следующему шагу. Обновите ConfigService, чтобы прочитать json файл, используя http.get. Теперь я получаю сообщение об ошибке. Вот обновленные файлы:
export class ConfigService {
private config: Config;
constructor(private http: Http) {
}
load(): Promise<Config> {
this.http.get("/blah/config.json")
.map(res => res.json())
.subscribe((env_data) => {
console.log(env_data);
});
this.config = new Config("localhost", "5050");
return Promise.resolve(this.config);
}
getConfig(): Config {
return this.config;
}
}
Вот раздел поставщиков в классе NgModule
providers: [AuthService,
Title,
appRoutingProviders,
ConfigService,
{
provide: APP_INITIALIZER,
useFactory: (config: ConfigService) => () => config.load(),
deps: [ConfigService, Http],
multi: true
}],
Обратите внимание, что в RC6 я не могу импортировать HTTP_PROVIDERS, так как я получаю ошибку, что они больше не определены в модуле http. Вот почему я попробовал Http.
Во время выполнения я получаю следующую ошибку
(index):27 Error: Error: Can't resolve all parameters for ConfigService: (?).(…)(anonymous function) @ (index):27
ZoneDelegate.invoke @ zone.js:332
Zone.run @ zone.js:225(anonymous function) @ zone.js:591
ZoneDelegate.invokeTask @ zone.js:365
Zone.runTask @ zone.js:265
drainMicroTaskQueue @ zone.js:497
ZoneTask.invoke @ zone.js:437