# #angular #firebase #ionic-framework #navigation #router
Вопрос:
После входа в систему с помощью метода входа в Google firebase я хочу перейти на домашнюю страницу. Я не могу понять, почему навигация не работает. Вот мой код:
async signInWithGoogle() {
// authentication works:
await this.afAuth.signInWithRedirect(new firebase.auth.GoogleAuthProvider());
// but the following code doesn't get executed:
this.ngZone.run(() => {
this.router.navigate(['tabs/home']);
});
}
Ответ №1:
Для навигации вам следует использовать один из этих методов:
this.router.navigate(['tabs', 'home']);
или
this.router.navigateByUrl('/tabs/home');
Комментарии:
1. Спасибо за ваш ответ. Я перепробовал все разные способы навигации. Но я обнаружил, что любой код ниже этой строки не будет выполняться. проблема, похоже, в чем-то другом. С помощью этого кода я ожидаю, что все следующие строки будут выполнены после завершения асинхронной операции. Но, похоже, это не так. Есть ли этому объяснение?
2. @Milchgraf, вероятно
this.afAuth.signInWithRedirect
, потерпит неудачу. Попробуй завернуть его вtry/catch
это .3. Я уже пробовал это.
this.afAuth.signInWithRedirect
илиthis.afAuth.signInWithPopup
работает совершенно нормально. Я также попытался привязать «.затем» к этому методуthis.afAuth.signInWithRedirect(new firebase.auth.GoogleAuthProvider()).then()
4. @Milchgraf Работает ли навигация, если вы удалите/прокомментируете
this.afAuth.signInWithRedirect
строку? Вы проверили внутренний звонокrun()
? Это звонки? У вас есть какие-нибудь охранники для навигации? И попытайтесь ориентироваться безngZone.run()
5. Да, у меня есть охранник на /вкладках/дома. Когда я использую
this.afAuth.signInWithPopup
код внутри run (), он отключается, но навигация не работает. Я думаю, это из-за охраны на /вкладках/дома. Когда я используюthis.afAuth.signInWithRedirect
, я должен проверить результат перенаправления черезthis.afAuth.getRedirectResult()
. Этот метод должен быть запущенngOnInit()
на странице входа в систему. Но навигация работает только в том случае, если я отключу охрану на /вкладках/дома.
Ответ №2:
Мой охранник выглядит так:
canLoad(
route: Route,
segments: UrlSegment[]): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
if (!this.authService.isLoggedIn) {
this.router.navigateByUrl('welcome');
}
return this.authService.isLoggedIn;
}
и isLoggedIn
добытчик выглядит так:
get isLoggedIn() {
const user = JSON.parse(localStorage.getItem('user'));
return (user !== null amp;amp; user.emailVerified !== false) ? true : false;
}
я предполагаю, что возвращаемое значение является ложным, потому что все остальное работает синхронно
Я добавил метод getAuthState в AuthService, который возвращает логическое значение, но asynchron:
async getAuthState() {
const result = await this.afAuth.getRedirectResult();
if (result.user) {
return true;
} else {
return false;
}
}
И обновил охрану, чтобы она выглядела так:
canLoad(
route: Route,
segments: UrlSegment[]): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
if (!this.authService.isLoggedIn) {
this.router.navigateByUrl('welcome');
} else {
return this.authService.isLoggedIn;
}
if (!this.authService.getAuthState()) {
this.router.navigateByUrl('welcome');
}
return this.authService.getAuthState();
}
и на странице входа в систему я добавил:
this.authService.getAuthState().then(result => {
console.log(result);
if (result) {
console.log('should redirect');
this.router.navigateByUrl('/tabs/home');
}
});
ведение журнала консоли выполняется true
и should redirect
, но не перенаправляется на /вкладки/главная страница.
Может быть, мне нужно провести небольшое исследование.. Здесь я обнаружил аналогичную проблему
Ответ №3:
Я нашел решение для защиты от аутентификации здесь
Вход в систему-Компонент:
ngOnInit() {
this.authService.getAuthState().then(result => {
if (result) {
this.router.navigateByUrl('/tabs/home');
}
});
if (this.authService.isLoggedIn) {
this.router.navigateByUrl('tabs/home');
}
}
Авто-Охранник:
return new Promise((resolve, reject) => {
firebase.auth().onAuthStateChanged((user: firebase.User) => {
if (user) {
resolve(true);
} else {
this.router.navigate(['/welcome']);
resolve(false);
}
});
});
И в службе аутентификации я только выполняю вход в систему и выполняю проверку подлинности для результата перенаправления:
async signInWithGoogle() {
await this.afAuth
.signInWithRedirect(new firebase.auth.GoogleAuthProvider());
}
async getAuthState() {
const result = await this.afAuth.getRedirectResult();
if (result.user) {
return true;
} else {
return false;
}
}