Вот несколько вещей, которые вы можете попробовать:
Цепочка обещаний (убедитесь, что навигация выполнена, прежде чем вы скажете aurelia переключить корень)
this.router.navigate('/', { replace: true, trigger: false })
then(() => this.aurelia.setRoot(PLATFORM.moduleName("app")));
Разрешить обещания (было бы необходимо, если бы маршрутизатор все еще имел работу после текущего activate
, потому что эту работу нужно было бы прервать)
return this.router.navigate('/', { replace: true, trigger: false })
then(() => this.aurelia.setRoot(PLATFORM.moduleName("app")));
Убедитесь, что AppRouter
переконфигурирован после переключения root (точка останова в configureRouter
, вам может потребоваться вручную .reset()
маршрутизатор, флаг isConfigured
все равно остается верным)
Вы можете попробовать совсем другой подход.
Лично, когда мне нужно переключить root между общедоступной и аутентифицированной оболочкой, у меня просто есть выделенный префикс пути для любого (или обоих), и в моем методе main
я устанавливаю правильный корень App
на основе текущий window.location
.
Пример (в main
):
if (/\/public/.test(window.location.pathname)) {
au.setRoot(PLATFORM.moduleName("shell/public"));
} else if ((/\/admin/.test(window.location.pathname)) {
au.setRoot(PLATFORM.moduleName("shell/admin"));
} else {
au.setRoot(PLATFORM.moduleName("shell/app"));
}
Перенаправление между этими корнями выходит за пределы маршрутизатора, просто с помощью window.location.href = "..."
;
Несмотря на то, что это, возможно, немного странно, хорошая особенность этого подхода состоит в том, что у вас всегда будет полностью чистое состояние Aurelia после переключения, и, следовательно, вам потребуется меньше времени для очистки после него.
В закрытых корнях вы пытаетесь получить токен аутентификации из localStorage и просто отбросить пользователя обратно до public
, если его нет (или у него нет достаточных привилегий).