0

В общем есть такая конфигурация:

const appRoutes: Routes = [
  {
    path: '', component: BaseComponent, resolve: { data: PermissionResolver }, children: [
      {
        path: '', loadChildren: './area/Home/Home.module#HomeModule',
      }
}

Внутри модуля Home такой роут:

const homeRoutes: Routes = [
  { path: '', redirectTo: '/home', pathMatch: 'full' },
  {
    path: 'home', component: homeContainerComponent, children: [
      {
        path: 'add', component: AddContainerComponent, canActivate: [CanActivateAdd], children: [
          {
            path: '', component: AddComponent
          }
        ]
      }
    ],
  }
];

Так вот, когда я сразу иду на home/add через адресную строку, то Resolve не срабатывает, а срабатывает сразу же canActive.

Вообще я ожидал, что Guard'ы будут срабатывать в иерархическом порядке.

Т.е сначала Resolve, так как он висит в корневом маршруте, а потом уже все дочерние Guard'ы.

Как добиться желаемого? Т.е сначала получить учетные данные от API в независимости куда пользователь зашел, а затем использовать canActive?

Нашел только вот такую статейку, как из ресолвера делают canActive. Неужели нет методов "из коробки"?

iluxa1810
  • 24,899
  • а почему на каждый чилдовый роутер не повесить резолвер вместо родительского? – Kostiantyn Okhotnyk May 17 '19 at 10:44
  • А зачем резолвить каждый маршрут? Имхо, процесс должен быть выполнен 1 раз в корне. – iluxa1810 May 17 '19 at 10:45
  • не совсем так. Каждый роут - это независимая сущность. Я могу написать example.com/test а могу example.com/home и в каждом случае должен быть свой резолвер. Другое дело, что данные должны скачиваться 1 только раз. Так в предыдущем вопросе я показывал как закешировать результат – Kostiantyn Okhotnyk May 17 '19 at 10:48
  • Для этого нужено использовать rxjs. (Тут)[https://ru.stackoverflow.com/questions/982062/Запретить-юзеру-ходить-по-запрещенным-маршрутам/982174] добавлял пример с использованием rxjs shareReplay – Kostiantyn Okhotnyk May 17 '19 at 10:51
  • @KostiantynOkhotnyk не сочтите за грубость, но по вашему ответу и примеру кода с Resolve<Observable<string>> и return UserService.getData(someData).subscribe(...); - я вижу, что вы понятия не имеете для чего используются резолверы и как они работают – arturovt May 17 '19 at 13:19
  • @overthesanity используются для предзагрузки данных в компоненте. Вы как -то по другому используете? И в чем собственно проблема? В Resolve<Observable> и сабскрайбе? Так я отладкой не занимался – Kostiantyn Okhotnyk May 17 '19 at 14:02
  • @iluxa1810 https://stackblitz.com/edit/angular-bovd6k – arturovt May 17 '19 at 14:36
  • @KostiantynOkhotnyk люди которые используют резолверы и знают как с ними работать никогда не напишут Resolve<Observable<string>> и return subscribe(...), сори – arturovt May 17 '19 at 14:38
  • @overthesanity Т.е в этом случае я инициализирую свой сервис до canActive? – iluxa1810 May 19 '19 at 11:52
  • @overthesanity классно, работает. Можете ответом? Получается, что аутентификацию нужно грузить при инициализации? – iluxa1810 May 20 '19 at 08:29
  • @iluxa1810 для меня достаточно что у тебя заработало :) я не фармлю очки – arturovt May 20 '19 at 15:08

0 Answers0