2016-08-01 3 views
2

В моем приложении Angular2 мне нужно сделать вызов какой-либо функции из приложения AuthenticationService и bootstrap на основе результатов этого вызова. Проблема заключается в том, что AuthenticationService имеет зависимость от HTTP от @ angular/http, и у меня очень мало информации о том, как создать службу http вручную, прежде чем вызывать функцию загрузки. Принятый ответ в этом вопросе angular2 bootstrap with data from ajax call(s) описывает то, что я хочу достичь совершенно, но, к сожалению, это было дано какой-то предыдущей версии Angular2.Сделать запрос AJAX перед загрузкой Приложение Angular2

Я попытался создать службы HTTP таким образом:

let injector = ReflectiveInjector.resolveAndCreate(HTTP_PROVIDERS) 
let http = injector.get(Http); 

, но я получил нулевое эталонное исключение в XsrfCookieStrategy или что-то подобное. Я считаю, что можно ввести какую-то пустую XsrfStrategy, но она, похоже, больше похожа на взлома, чем на хорошее решение. Итак, вопрос в том, есть ли хороший (официальный) способ загрузки приложения Angular2 с предоставлением некоторых зависимостей вверх, похожих на ссылку, добавленную выше.

+1

Вы можете самонастройки компонент, который просто делает вызов Ajax и он самонастройки ваш реальный компонент ... Действительно, хотя вы можете просто хотите запрограммировать основной компонент, поэтому он может отобразить состояние для вашего приложения перед вызовом, а также делает сам вызов. –

+0

Джейсон, я думаю, я могу понять, что вы имеете в виду здесь, но есть ли примеры или код, которые иллюстрируют идею приложения, построенного таким образом? Код, который я хочу запустить в бутстрапе, является главной и единственной точкой входа, поэтому он должен выполняться на любом маршруте (url) даже до того, как будет происходить что-то вроде маршрута. Поэтому я задаюсь вопросом, каков правильный угловой способ сделать это. Я думал, что размещение этого кода в файле bootstrap.ts было бы хорошей идеей –

+0

Я еще не нашел «лучший способ» сделать это, у меня есть такая же проблема. Вот почему я написал комментарий вместо ответа, может быть лучший способ сделать это. Что бы вы могли сделать, у него есть «ParentComponent», который вы загружаете, и который выполняет первоначальный вызов API, и просто включите его в основной компонент с ngIf, когда ваш начальный вызов завершен. ' –

ответ

1
class AuthService { 
    isLoggedIn:BehaviorSubject<boolean> = BehaviorSubject<boolean>(false); 
    checkLogin(http:Http) { 
    return http.get(...) 
    .map(result => result.json()) 
    .do(result => this.isLoggedIn.next(result) 
    } 
} 

bootstrap(AppComponent, [ 
    HTTP_PROVIDERS, 
    AuthService, 
    { provide: APP_INITIALIZER, 
    useFactory: (authService:AuthService) => authService.checkLogin(), 
    deps: [AuthService], 
    multi: true 
    } 
]); 

Смотрите также How to pass parameters rendered from backend to angular2 bootstrap method

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