Угловые два модуля с одинаковым путем - PullRequest
0 голосов
/ 05 июня 2018

В моем приложении два модуля: HomeModule и LoginModule .Я хочу иметь возможность загружать два разных модуля по одному пути.Какой модуль загружается, зависит от того, вошел ли пользователь в систему или нет.
Если пользователь вошел в систему, HomeModule должен загрузить его, если нет - LoginModule должен загрузить.

Я пробовал этот код, нет ошибки вконсоль HomeModule загружается, если пользователь вошел в систему, но если пользователь не вошел в систему - ничего не загружается.Если я изменим порядок своих маршрутов, LoginModule будет работать, а HomeModule - нет. HomeGuard .canLoad () возвращает true, если пользователь вошел в систему, LoginGuard .canLoad () возвращает true, если пользователь не вошел в систему.

HomeGuard .canLoad:

if (this.userSessionService.userSession) {
    return true;
}
this.router.navigate(['./']);
return false;

LoginGuard .canLoad:

if (this.userSessionService.userSession) {
    this.router.navigate(['./']);
    return false;
}
return true;

Мой маршрут:

{ path: '', loadChildren: './home/index#HomeModule', canLoad: [HomeGuard] },
{ path: '', loadChildren: './login/index#LoginModule', canLoad: [LoginGuard]}

Он должен работать как основной маршрут в веб-приложении Facebook.Если я захожу на facebook.com , я вижу страницу входа, если я не вошел в систему, если я вошел в систему, я вижу приложение как зарегистрированный пользователь.

1 Ответ

0 голосов
/ 05 июня 2018

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

Вместо этого можно попробовать использовать URL matcher .Единственная проблема здесь в том, что сопоставитель - это просто функция.Вы хотите вернуть true или false в зависимости от состояния службы.В качестве временного подхода вы можете использовать глобальную переменную в качестве флага, чтобы увидеть, поможет ли использование сопоставителя.

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

 {
    path: '',
    resolver: { ignore: ResolveUserStateForMatcher },
    children: [
         { matcher: MatchHomeRoute, loadChildren: './home/index#HomeModule' },
         { matcher: MatchLoginRoute, loadChildren: './login/index#LoginModule' }
    ]
 }

Дело в том, что средство сопоставления не позволяет маршрутизатору выполнять какую-либо логику для HomeModule, когда пользовательвошел в систему. Это то же самое, что не загружать модуль.

Я не уверен, каким должен быть MatchResult для них.

...