#angular
#angular
Вопрос:
У меня есть приложение angular. В этом приложении у меня есть AuthService
. Это AuthService
позволяет авторизовать одного пользователя с помощью аутентификации firebase.
Мой вопрос заключается в следующем:
Считаете ли вы, что служба несет ответственность за переход на страницу успеха в случае успешной регистрации? Или это должен быть компонент, вызывающий службу?
И если есть ошибка (например, неверный пароль в моем случае), как бы вы вернули эту информацию компоненту, чтобы отобразить ее пользователю?
Мой сервис:
import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { auth } from 'firebase/app';
import { AngularFireAuth } from '@angular/fire/auth';
import { User } from 'firebase';
@Injectable({
providedIn: 'root'
})
export class AuthService {
user: User;
constructor(public afAuth: AngularFireAuth, public router: Router) {
this.afAuth.authState.subscribe(user => {
if (user) {
this.user = user;
localStorage.setItem('user', JSON.stringify(this.user));
} else {
this.user = null;
localStorage.setItem('user', null);
}
});
}
async login(email: string, password: string) {
let result = await this.afAuth.auth.signInWithEmailAndPassword(
email,
password
);
this.router.navigate(['...']);
}
}
Мой компонент:
import { Component } from '@angular/core';
import { AuthService } from '../auth.service';
import { NgForm } from '@angular/forms';
@Component({
selector: 'app-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.css']
})
export class LoginComponent {
constructor(private authService: AuthService) { }
onSubmit(form: NgForm) {
this.authService.login(form.value.email, form.value.password);
}
}
Комментарии:
1. Вам все еще нужна помощь с этим?
Ответ №1:
Чтобы ответить на ваш вопрос
Считаете ли вы, что служба несет ответственность за переход на страницу успеха в случае успешной регистрации? Или это должен быть компонент, вызывающий службу?
Для соответствующего чистого кода, я думаю, вам нужно обрабатывать логику навигации в сервисе, потому что время от времени ваш компонент будет расти, а вашу кодовую базу очень сложно поддерживать. Или я бы посоветовал вам изучить библиотеку NGRX, у них есть эффект вызова 1 уровня, поэтому вы можете использовать логику побочных эффектов для своего приложения, а класс service выполняет только вызов API.
И если есть ошибка (например, неверный пароль в моем случае), как бы вы вернули эту информацию компоненту, чтобы отобразить ее пользователю?
То же, что и мой вариант выше. И я бы посоветовал вам использовать подход с побочным эффектом, потому что ошибка API также будет обрабатываться внутри класса effect
Ниже приведен пример моего приложения. Когда я получу успешное действие входа в систему, я перенаправлю вход пользователя на страницу портала. Чтобы полностью понять этот шаблон, вы можете взглянуть на эту картинку
Компонент отправляет действие. Действие будет обработано по эффекту, если нам понадобится какой-либо побочный эффект (например, в этом примере перенаправляет пользователя на поратальную страницу, если они успешно вошли в систему). Затем редуктор вычислит новое состояние на основе типа действия и данных, поступающих со стороны компонента или эффекта, а затем обновит пользовательский интерфейс, чтобы отразить изменение.
@Effect({dispatch: false})
loginSuccess$ = this
.actions$
.pipe(ofType(authAction.LoginActionTypes.LOGIN_SUCCESS), tap(() => this.router.navigate(['/portal'])));
Вы можете взглянуть на мой полный образец здесь и на библиотеку NGRX
Комментарии:
1. Мне интересно узнать больше о «подходе с побочным эффектом», у вас есть какая-нибудь ссылка? Потому что для меня это не роль службы, чтобы знать, хотим ли мы отобразить ошибку
2. Точно так же, как я упоминал выше. Вы можете взглянуть на библиотеку NGRX
3. Хорошо, но я думал, что достоверность формы — это слишком много деталей пользовательского интерфейса, чтобы быть в NGRX
4. Что вы имеете в виду слишком много. Вы можете использовать реактивную форму для выполнения проверки. NGRX — это просто библиотека управления состоянием
5. Да, для успеха я согласен, что это может быть действие, но для сбоя это будет означать, что в моем редукторе у меня есть статус «сообщение о сбое входа», которое я должен обновить и прослушать при входе в систему, нет?