Не удалось выполнить router.navigate для лениво загруженных дочерних модулей.

Я новичок в угловых. Я начинаю с последней версии, 8.

Я пытаюсь написать приложение. Начальным состоянием маршрута является путь: '', и я хотел бы определить следующий маршрут на основе некоторого условия в базовом пути здесь. Если условие истинно, мне нужно перенаправить пользователя в /home, а если это не удается, мне нужно перенаправить в /welcome. И home, и welcome загружаются лениво.

У меня есть служба охраны, где принимается решение о маршрутизации (какой путь выбрать).

app-routing.ts

import { Routes, RouterModule } from '@angular/router'; 
import { HomeGuardService } from './services/route-guard/home-guard.service';


const routes: Routes = 
[ 
    { 
        path: '', pathMatch: 'full', 
        canActivate: [HomeGuardService], 
        children: 
        [ 
            { path: 'welcome', loadChildren: () => import('./welcome/welcome.module').then(mod => mod.WelcomeModule), }, 
            { path: 'home', loadChildren: () => import('./home/home.module').then(mod => mod.HomeModule) } 
        ] 
    } 
]; 

@NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule] }) 
export class AppRoutingModule { }

home-guard.service.ts

import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router/src/router_state'; 
import { LocalStorageService } from '../storage/local-storage.service'; 

@Injectable({ providedIn: 'root' }) 
export class HomeGuardService implements CanActivate { 

    constructor( private router: Router) { } 

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { return this.checkCountrySelection(state); } 


    private checkCountrySelection(state: RouterStateSnapshot): boolean { 
        if (<my_condition>) { 
            this.router.navigate(['home']); 
            return true; 
        } 
        this.router.navigateByUrl('welcome'); 
        return false; 
    } 
}

Теперь, с этой настройкой, angular жалуется, что не может сопоставить какие-либо маршруты для URL-сегмента: «добро пожаловать»

(Изначально я поставил условие на отказ в сервисе homeguard, чтобы он загружал приветственный модуль)


person Super Test    schedule 04.06.2019    source источник
comment
Welcome и Home не должны быть дочерними элементами пути по умолчанию.   -  person Vinod Bhavnani    schedule 04.06.2019


Ответы (2)


Вы не можете определить детей по пути по умолчанию, вы можете изменить массив маршрутов на:

const routes: Routes = 
[ 
  { 
    path: 'welcome',
    canActivate: [HomeGuardService],
    loadChildren: () => import('./welcome/welcome.module').then(mod => mod.WelcomeModule)
  },
  { 
    path: 'home',
    canActivate: [HomeGuardService],
    loadChildren: () => import('./home/home.module').then(mod => mod.HomeModule)
  }
  ...
person ilyas shabi    schedule 04.06.2019
comment
На самом деле я не хочу загружать какой-либо компонент или модуль для пути по умолчанию. Я хочу, чтобы он загружался либо домой, либо в приветствие. Если бы я не сделал их дочерними, путь по умолчанию потребовал бы от меня добавления компонента или модуля. В нем говорится: «Должно быть предоставлено одно из следующего: компонент, перенаправление, дети или loadChildren». - person Super Test; 04.06.2019
comment
Я изменил маршрут, чтобы загрузить исходный путь к корневому пути и перенаправить на приветствие, когда условие не выполняется (в страже) - person Super Test; 07.06.2019

Ваши маршруты являются детьми охраняемой группы.

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

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

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

person Community    schedule 04.06.2019
comment
Спасибо ! Я на самом деле могу это понять. На самом деле, я следил за парой подобных вещей – › stackoverflow.com/questions/49405281/ - person Super Test; 04.06.2019