Подтвердить что ты не робот

Angularjs2 - предварительная конфигурация сервера перед запуском приложения

Я работаю с Angular2 RC5. Я хочу, чтобы загрузить мой IP-адрес сервера и некоторые другие параметры конфигурации до загрузки моего приложения. Как я могу сделать это в последнем RC5?

Я видел другие статьи, но они не помогают:

Любая помощь будет принята с благодарностью.

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
4b9b3361

Ответ 1

Предоставьте это в корневом модуле

{provide: APP_INITIALIZER, useValue: () => promise, multi: true}]}

где () => promise - это некоторый вызов, который возвращает Promise, который разрешает требуемое значение.

См. также Как передать параметры, переданные из backend в метод angular2 bootstrap

Вы можете передать службу как зависимость, в которой вы можете сохранить результат.

Обновление

export function loadConfig(config: ConfigService) => () => config.load()

@NgModule({
        declarations: [AppComponent],
        imports: [BrowserModule,
            routes,
            FormsModule,
            HttpModule],
        providers: [AuthService,
            Title,
            appRoutingProviders,
            ConfigService,
            { provide: APP_INITIALIZER,
              useFactory: loadConfig,
              deps: [ConfigService], 
              multi: true }
        ],
        bootstrap: [AppComponent]
    })
    export class AppModule { }

обновление 2

Пример плунжера