угловой 2 резольвер для каждого вида

Итак, мое приложение основано на angular 2 (angular cli) и некоторых CMS. Некоторые фрагменты страницы загружаются из CMS и отображаются на странице angular 2. Основная проблема в том, что верхний и нижний колонтитулы взяты из CMS. Поэтому мне интересно, как добавить глобальный преобразователь (глобальный очень важен, я не хочу добавлять преобразователь для каждого пути маршрута в приложении), который заставит angular ждать, пока CMS вернет верхний и нижний колонтитулы. Я уже успешно использую преобразователь для ожидания некоторых данных на некоторых маршрутах, реализуя интерфейс маршрута.

export class InboxResolver implements Resolve<MessageListItem[]>

и я использую его в некоторых пользовательских маршрутах:

const MessagesRoutes: Routes = [
 {
    path: 'inbox',
    component: InboxComponent,
    resolve: { messages: InboxResolver }
 }
];

Но как определить один глобальный HeaderAndFooterResolver в одном месте?


person user2771738    schedule 05.12.2016    source источник
comment
Насколько я знаю, сделать то, что вы просите, невозможно. Одно из решений состоит в том, чтобы добавить в преобразователь функцию, которая проверяет, загружены ли данные уже. Это, по крайней мере, предотвратит дублирование вызовов, хотя вам все равно понадобится преобразователь на каждом маршруте.   -  person VSO    schedule 06.12.2016


Ответы (3)


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

const MessagesRoutes: Routes = [
    { path: '', resolve: { messages: InboxResolver }, children: [
        { path: 'inbox', component: InboxComponent},
        { path: 'xxx', component: XxxComponent},
        { path: 'zzz', component: XxxComponent},
    ]}
];
person Günter Zöchbauer    schedule 06.12.2016
comment
Да, я пытаюсь что-то подобное, как ты сказал. Но родительский маршрут включает компонент app.template.component, который использует TemplateResolver, также известный как inboxResolver, который извлекает верхний и нижний колонтитулы из CMS. Подводя итог, идея заключается в том, чтобы создать родительский маршрут приложения, поэтому каждый другой маршрут должен быть его дочерним. Таким образом, этот распознаватель будет распознавателем для каждого маршрута в приложении, поскольку каждый маршрут является дочерним маршрутом маршрута шаблона приложения. - person user2771738; 06.12.2016
comment
Да, каждый маршрут должен быть дочерним маршрутом этого маршрута, или вы добавляете преобразователь к каждому маршруту. - person Günter Zöchbauer; 06.12.2016
comment
Кажется грязным, но у меня нет лучшего решения, и это идея. Может быть, какое-то решение, не связанное с защитой маршрутизатора? - person VSO; 07.12.2016
comment
Подход с преобразователем на бескомпонентном родительском маршруте — это предложение разработчика маршрутизатора из команды Angular. - person Günter Zöchbauer; 07.12.2016

В основном вам нужен один resolver для каждого component, и его нужно объявить один раз для каждого маршрута, если только они не являются родительскими > дочерними, вы можете разделить преобразователь между ними, как показано ниже:

const MessagesRoutes: Routes = [
  { path: '', resolve: { messages: EmailResolver }, children: [
    { path: 'inbox', component: InboxComponent },
    { path: 'outbox', component: OutboxComponent },
    { path: 'sent', component: SentComponent },
    { path: 'received', component: ReceivedComponent }
  ]}
];
person Alireza    schedule 01.07.2017

Если вы просто хотите добавить преобразователь к каждому маршруту верхнего уровня, тогда это сделает что-то вроде приведенного ниже.

   const addGlobalResolver = <T extends Type<Resolve<any>>>(routePaths: Routes, resolver: T, name: string): Routes => {
      return routePaths.map(route => {
        if (route.resolve != null || route.resolve === undefined) {
          route.resolve = {};
        }
        route.resolve[name] = resolver;
        return route;
      });
    };

Просто вызовите его, прежде чем передавать маршруты в модуль маршрутизации.

[RouterModule.forRoot(addGlobalResolver(routes, InjuryResolver, 'Injury'))]
person garty    schedule 28.02.2019