2016-10-16 2 views
3

Мне нужно получить конфигурацию с сервера перед загрузкой приложения. Я был в состоянии сделать это, используя это в провайдерах в моем главном ngModule:Угловой 2 получить конфигурацию с сервера перед загрузкой

{ 
    provide: APP_INITIALIZER, 
    useFactory: (links: Links) =>() => links.init(), 
    deps: [Links, Http], 
    multi: true 
} 

Ссылки службы:

init(): Promise<any> { 
    var observable = this.http.get('someUrl').map(res => res.json()); 
    observable.subscribe(res => { 
     this.config = res; 
    }); 
    return observable.toPromise(); 
} 

Этот код запускается на выполнение перед бутстрэпами приложений, но ответ от сервера не нет до тех пор, после моего приложения запрашивает Links.config. Как заставить приложение не загружаться до тех пор, пока обещание не будет разрешено? Я попробовал prom.veolve(), но это не помогло.

Как я использовал поставщиков Я думал, что я заставил приложение использовать один и тот же экземпляр ссылок, а также я думал, что данные будут уже присутствовать там. Что я делаю неправильно?

ответ

3

В моем коде я делаю то же самое, и это работает только в том, что я конвертирую запрос в Promise перед сопоставлением.

public load(): Promise<void> { 
    let headers = new Headers({ 'Content-Type': 'application/json' }); 
    let url = this.urls.settings; 

    return this.http.get(url, { headers }).toPromise(). 
     then(configs => { 
      this.startupSettings = configs.json(); 
     }).catch(err => { 
      log(err); 
     }); 
} 

...............................

{ 
     provide: APP_INITIALIZER, 
     useFactory: (config: StartupConfigurationService) =>() => config.load(), 
     deps: [StartupConfigurationService], 
     multi: true 
    } 

Я не уверен, это будет иметь смысл, но попробовать, может быть он будет решать

+1

Блестящий, у меня была ошибка в решении обещания, ваш путь работает. Благодаря ! – Zoidy

0

Пожалуйста, посмотрите на работе вокруг, что я здесь

Loading server side settings angular2 2.0.1

используется в коротком охраннике маршрут остроумия h должен также работать класс CanActivate с использованием Promise, который загружает настройки конфигурации.

Обеспечивает доступность ваших настроек при создании соответствующих компонентов. (использование APP_INITIALIZER не ограничивало вызывающий конструктор, поэтому мне пришлось использовать эту технику. Также убедитесь, что вы не экспортируете все компоненты в экспорте: [] в модуле)

2

Как предложено в #37611549 и #35215112, утилита @ngx-config/core может быть полезна для получения вашего конфига с сервера во время инициализации приложения.

Вы можете добиться аналогичных результатов, получая данные в рамках импорта SystemJS. Тем не менее, я не предлагаю такой подход - потому что это создаст риск того, что ваши значения конфигурации не будут статически анализироваться во время компиляции AoT.

+1

Просто ссылка на вашу собственную библиотеку - не лучший ответ. Обращаясь к нему, объясняя, почему он решает проблему, предоставляя код о том, как это сделать и отказываясь от того, что вы написали, он дает лучший ответ. См.: [** Что означает «хорошее» самореклама? **] (http://meta.stackexchange.com/q/182212/200235) – Ferrybig

+1

Спасибо @Ferrybig. Конечно, я хочу предоставить более подробные, углубленные инструкции по коду. Однако, когда я отвечаю за ту же проблему на несколько потоков, система идентифицирует ее как дубликат. –

+0

Я искал часы о том, как наилучшим образом предоставить конфигурацию на стороне сервера для приложения. Этот ответ на сегодняшний день является самым безболезненным способом сделать это, и это очень хорошо документировано. Благодаря! – jlh

Смежные вопросы