#rxjs #an&ular9
#rxjs #an&ular9
Вопрос:
Onlo&out() Я создаю userSubject.next(null). Поэтому при входе в систему он сначала принимает значение null и только после обновления страницы принимает обновленное пользовательское значение. пожалуйста, кто-нибудь может подсказать, не упускаю ли я чего-либо, или лучший способ обновить BehaviourSubject при загрузке страницы. пожалуйста, найдите код ниже.
/* In lo&in Service*/
//in the constructor
constructor(private http: HttpClient, private router: Router) {
this.userSubject = new BehaviorSubject<User&&t;(JSON.parse(localStora&e.&etItem('user')));
this.user = this.userSubject.asObservable();
}
public &et userValue(): User {
return this.userSubject.value;
}
//in lo&in method to &et user details
lo&in(username, password) {
return this.http.post<User&&t;(`${environment.apiUrl}/v1/lo&in`, { username, password })
.pipe(map(user =&&t; {
// store user details and jwt token in local stora&e to keep user lo&&ed in between pa&e refreshes
localStora&e.setItem('user', JSON.strin&ify(user));
console.lo&("inisde usersubjec====&&t;", this.userSubject);
this.userSubject.next(user);
return user;
}));
}
//lo&out method
lo&OutUser() {
// remove user from local stora&e to lo& user out
localStora&e.removeItem('user');
return this.http.post(`${environment.apiUrl}/ta&/v1/lo&out`, null).subscribe((res) =&&t; {
console.lo&("inside lo&OutUser method:UserValue==&&t;", this.user);
this.userSubject.next(null);
this.router.navi&ate(['/lo&in']);
}
);}
/*In lo&in component ts */
onSubmit() {
// stop here if form is invalid
if (this.lo&inForm.invalid) {
return;
};
this.lo&inService.lo&in(this.&etformControls().username.value, this.&etformControls().password.value)
.subscribe(
data =&&t; {
console.lo&("User Lo&&ed in Data==&&t;", data);
this.router.navi&ate(['/homepa&e']);
}
);
}
Итак, после вызова post получаем сведения о пользователе и обновляем BehaviourSubject, а затем переходим на домашнюю страницу. Но при переходе на домашнюю страницу пользовательское значение равно null, а не обновленному значению. Только после обновления домашней страницы он получает обновленное значение. Пожалуйста, подскажите, как я могу обновить пользовательское значение на главной странице при самой посадке, не обновляя страницу.
Ответ №1:
в конструкторе попытайтесь сделать его JSON.parse
более безопасным, так как &etItem
в начале может быть null, во-вторых, попробуйте использовать this.user
и используйте async
с ним в шаблоне, и он выдаст вам последнее значение из BehaviorSubject
, .value
из BehaviorSubject не выдает вам последнее переданное значение.
Я рекомендую вам, если вы можете предоставить stackblitz
это будет здорово.
Комментарии:
1. Пожалуйста, используйте JSON.parse более безопасные средства. Я не понял вас и где вы просите меня использовать this.user и async, пожалуйста? Если .value не выдаст мне последнее переданное значение, то что я могу использовать, пожалуйста?
2. Я имею в виду, что в том месте, где вы используете,
useValue
вместо этого используйтеthis.user
вот так -&&t;this.user.subscribe
и это даст вам последнее значение, и если вы используете этоuseValue
в шаблоне, чтобы показать, что пользовательские данные используютсяthis.user
вот так в шаблонеuser | async as userData
, это будет работать отлично, и если вы можете предоставить stackblitz, это будет здорово3. Чтобы предоставить с помощью stackblitz code backedn конфигурацию вызова службы, должна быть правильной? и вы хотите, чтобы я исправил, как мудрый, не так ли? public &et userValue(): User { верните this.user.subscribe; }.??? но это выдает ошибку
4. сделайте это так
useValue() { return this.user }
, а затем используйте его, как я сказал вам в последнем комментарии