#angular #firebase #firebase-realtime-database
#angular #firebase #firebase-база данных в реальном времени
Вопрос:
Прямо сейчас у меня есть проект Angular 2, который принимает учетные данные для входа пользователей и перенаправляет пользователя к компоненту моего профиля.
home.component.ts
constructor(public router: Router){}
signInSubmit(){
var self = this;
firebase.auth().signInWithEmailAndPassword(self.signInForm.value.smail, self.signInForm.value.spassword).catch(function(error){
console.log(error.message);
});
self.router.navigate(['profile']);
}
где profile
представляет страницу с данными Firebase пользователей (например, их имя пользователя). Моя проблема в том, что пользовательские данные не заполняются к моменту перенаправления пользователя. Они должны обновить страницу, чтобы увидеть ее заполнение.
My profile.component.ts
export class ProfileComponent implements OnInit {
private addsnotes$: FirebaseListObservable<string[]>;
private username$: FirebaseObjectObservable<string>;
addForm: FormGroup;
constructor(private af: AngularFire){}
ngOnInit(){
let user = firebase.auth().currentUser;
let userNamePath = `users/${user.uid}/username`;
let notesPath = `users/${user.uid}/addnote`;
this.username$ = this.af.database.object(userNamePath);
this.addsnotes$ = this.af.database.list(notesPath);
}
}
мой profile.component.html
<h4>Welcome {{ (username$ | async)?.$value }}</h4>
Когда я перенаправляюсь на маршрут моего профиля, мне говорят, что user
это null. Но опять же, это не проблема, если я просто обновлю страницу. Как я могу получить и вывести данные пользователя при повторном маршруте? Я также готов рассмотреть вариант обновления страницы, хотя я не уверен, как перейти к отдельному маршруту в Angular 2.
Комментарии:
1. Что происходит, когда вы используете
setTimeout
функцию дляuser
данных2. После установки тайм-аута для всего внутри моего ngOnInit он все равно возвращает ошибку после их запуска.
Ответ №1:
Проблема в том, что вы перенаправляете сразу после попытки входа с вашими учетными данными. Вам нужно дождаться успешного входа, прежде чем вы захотите изменить маршрут.
signInWithEmailAndPassword
Это вызов на основе обещаний, который также возвращает информацию о пользователе после успешного вызова. Итак, вы можете сделать это:
firebase.auth().signInWithEmailAndPassword(
self.signInForm.value.smail,
self.signInForm.value.spassword
)
.then((userInfo) => {
// Login was successful, NOW redirect
self.router.navigate([ 'profile' ]);
})
.catch((error) => {
// Do something, such as report the error on your sign in page
});