2016-12-19 4 views
1

Я использую Angular 2.3.Угловой 2 Делать и обрабатывать запрос Ajax для конфигурации до того, как модуль загружен BootStrapped

Я хотел бы сделать запрос ajax для загрузки данных в свою конфигурационную службу и разрешить инсталляцию службы конфигурации другим компонентам и службам после получения и обработки ответа ajax.

Я попробовал два метода до сих пор, ни один не работает:

В первую очередь, я использую эту технику в модуле приложения:

providers: [ 
    Config2Service, 
    { 
    provide: APP_INITIALIZER, 
    deps: [ Config2Service ], 
    multi: true, 
    useFactory: (configService: Config2Service) => { 
     return() => configService.initialize(); 
    } 
    } 
] 

В этом примере инициализации() возвращает обещание, которое фабрика завершает в функции, прежде чем возвращать эту функцию. Это была единственная комбинация, которая работает. Следующие не работают: (1) возвращение config.initialize. (2) возвращает результат вызова configservice.initialize().

Не поймите меня неправильно, функция инициализации configService называется на ранней стадии, но обещанное обещание не ожидается; то при загрузке компонентов при попытке доступа к данным конфигурации в службе конфигурации сбои приложения не выполняются. Спустя некоторое время данные конфигурации появляются и обрабатываются должным образом, но к тому времени их слишком поздно, приложение разбилось.

Во втором случае, я удалил выше, и пытался сделать это:

let providers = [ 
    { 
     provide: Http, useFactory: (backend: XHRBackend, options: RequestOptions) => { 
     return new Http(backend, options); 
     }, 
     deps: [XHRBackend, RequestOptions] 
    }, 
    BrowserXhr, 
    ConfigService, 
    XHRBackend, 
    { provide: RequestOptions, useClass: BaseRequestOptions }, 
    { provide: ResponseOptions, useClass: BaseResponseOptions }, 
    { provide: XSRFStrategy, useValue: new CookieXSRFStrategy() } 
]; 

let configService: ConfigService = ReflectiveInjector.resolveAndCreate(providers).get(ConfigService); 

configService.initialize() 
    .then(configData => { 
     platformBrowserDynamic().bootstrapModule(MyAccountModule.factory(configService)); 
    }); 

выше терпит неудачу с этой ошибкой: Unhandled Promise отбраковки: Не удается прочитать свойство «getCookie» в нуль в CookieXSRFStrategy. configureRequest

В примере SO я получил это, конкретная XSRFStrategy была вызвана NoopCookieXSRFStrategy, но я не могу найти это в папке @ angular/http. Я также не могу найти HTTP_PROVIDERS, из которого этот код возник, я думаю.

Я пробовал то, что я пытаюсь сделать, что мне не хватает?

ответ

1

Из моего личного опыта я никогда не мог получить APP_INITIALIZER, работая так, как мне это было нужно. Я не мог найти никаких примеров, которые сработали бы для меня. Поэтому я просто побежал с тем, что вы пытаетесь сделать во второй попытке. С этим, однако, вам необходимо расширить CookieXSRFStrategy и переопределить configureRequest. Здесь вышли NoopCookieXSRFStrategy.

class NoopCookieXSRFStrategy extends CookieXSRFStrategy { 
    configureRequest(request) { 
    // noop 
    } 
} 

См complete example

+0

Бинго. Спасибо. – IanT8

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

  • Нет связанных вопросов^_^