Angular2 RC5 - маршрут после завершения загрузки файла конфигурации

Я пишу приложение Angular2, используя RC5.

Когда загружается AppComponent, я хочу, чтобы приложение запрашивало файл конфигурации, используя http, и после его загрузки я хочу, чтобы приложение переходило по указанному маршруту?

Как я могу этого добиться?

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

Надеюсь, я ясно дал понять, чего я пытаюсь достичь.


person microchip78    schedule 25.08.2016    source источник
comment
Я думаю, вы ищете разрешение: angular .io/docs/ts/latest/api/router/index/   -  person JB Nizet    schedule 25.08.2016


Ответы (2)


Вы можете сохранить в canActivate Guard, что первоначальная повторная навигация была выполнена, и для последующих вызовов возвращать только true.

Вы можете настроить маршрутизатор с одним маршрутом

{ path: '**', InitComponent }

и в InitComponent загрузите свою конфигурацию, перенастройте маршрутизатор (пропустите все маршруты), а затем перейдите к первоначально запрошенному пути.

См. также Angular 2 Динамическое построение маршрутов и разрешения на уровне компонентов < /а>

person Günter Zöchbauer    schedule 25.08.2016
comment
Да, я думал об этом. Но есть ли в RC5 какое-либо другое положение, что даже перед переходом на какой-либо маршрут при первой загрузке приложения он идет и получает config. Я имею в виду разрешить этот сервисный вызов ... - person microchip78; 25.08.2016
comment
Потому что в этом решении каждый раз, когда я добавляю новый маршрут, я должен добавить к нему canActivate... это не элегантно - person microchip78; 25.08.2016
comment
Я не уверен, что ты имеешь в виду. Это первая загрузка приложения с глубокими ссылками? - person Günter Zöchbauer; 25.08.2016
comment
Я не совсем понял, но я попробую то, что вы здесь предложили, и дам вам знать... - person microchip78; 25.08.2016
comment
Спасибо за Ваш ответ. Кажется, он работает для одного модуля приложения, но не работает, когда у вас есть модуль для каждой функции в вашем приложении. Таким образом, все маршруты для корня приложений перенаправляются к компоненту инициализации, но когда пользователь пытается перейти в другую область приложения, в которой есть собственный модуль, он перенаправляет пользователя туда без маршрутизации к компоненту инициализации. - person microchip78; 04.09.2016
comment
Не уверен, что вы имеете в виду. Не могли бы вы создать новый вопрос с Plunker для воспроизведения? - person Günter Zöchbauer; 04.09.2016

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

Компонент.Маршрут:

export const routes: Route[] = [
  { path: ':id', component: Component1, resolve: { data: Comp1Resolver }}
];

Comp1Resolver:

@Injectable()
export class Comp1Resolverimplements Resolve<Config> {
    constructor(private configService: ConfigService) { }

    resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<Config> {
        return this.configService.get(route.params['id']);
    }
}

Компонент1:

ngOnInit() {
let that = this;
 this.route.data.subscribe(data => {
 that.config= data['data'];
person Marcel Hoekstra    schedule 25.08.2016
comment
Японял твою точку зрения. Но даже в этом случае он привязан к маршруту. Мое требование состоит в том, чтобы не переходить по какому-либо пути, пока я не получу ответ от службы и не загружу конфигурацию приложения с сервера. В приведенном выше примере, если я направлюсь по пути hostname/:id, тогда он вызовет Comp1Resolver, но что, если пользователь вызовет hostname/about или любой другой путь. Поэтому я также должен настроить все маршруты с одним и тем же преобразователем. - person microchip78; 25.08.2016
comment
Тогда вы можете делать то, что говорит Гюнтер. Создайте один маршрут с распознавателем и создайте childRoutes для /about, /:id и т. д. Тогда ваши URL-адреса будут иметь вид hostname/parent/about hostname/parent/id. - person Marcel Hoekstra; 25.08.2016