Угловые два модуля с одним и тем же путем

Mikemike спросил: 12 мая 2018 в 04:41 в: angular

У меня есть два модуля в моем приложении: 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 ответ

cgTag ответил: 12 мая 2018 в 04:56

canLoad не позволяет детям загружаться, но не мешает родителям сопоставлять маршрут.

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

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

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

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

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