javascript - BehaviourSubject.getValue() 返回默认值
问题描述
我对角度相当陌生。我有两个组件,即标题和配置文件组件。标头组件处理登录功能并维护两个信息 - 用户详细信息,它是 json 对象和 isLoggedIn,它是保存当前登录状态的布尔值。个人资料页面的总体布局是-
<header-component>
<profile-component>
现在因为标题组件处理登录。我想避免再次为配置文件组件编写获取 userDetails 和 isLoggedIn 状态的逻辑。所以我决定编写一个名为配置文件服务的共享服务,以便我可以从标题上传 userDetails 和 isLogged 并在配置文件组件中访问该信息。loginlogout 方法中的输入来自标头组件。
共享服务代码 -
import { Injectable } from '@angular/core';
import { HttpService } from './https.service';
import { Observable, BehaviorSubject, of as observableOf } from 'rxjs';
import * as _ from 'lodash';
import { HttpHeaders, HttpParams } from '@angular/common/http';
import { BaseService } from './base.service';
@Injectable()
export class ProfileServices{
constructor(){};
userDetailsBS = new BehaviorSubject<any>('original value');
userDetails= this.userDetailsBS.asObservable();
isLoggedIn:boolean;
loginlogout(userDetails:any , isLoggedIn:boolean){
this.userDetails=userDetails;
this.userDetailsBS.next(this.userDetails);
console.log("Value of user details set in profile service",this.userDetails); //debug
console.log(".getValue() method:",this.userDetailsBS.getValue()); //debug
this.isLoggedIn=isLoggedIn;
}
getUserDetails(){
return this.userDetailsBS.getValue();
}
}
从 header-component.ts 发布登录后,我调用配置文件服务中的 loginlogout 方法来设置值。我还尝试使用 getUserDetails 访问传递给共享服务的值,这表明 userDetails 对象已正确传递给共享服务。
当我尝试从配置文件组件访问数据时出现问题 -
export class ProfileT1Component implements OnInit {
userDetails:any;
constructor(
public profileService: ProfileServices){
this.profileService.userDetails.subscribe((result)=>{
console.log(result);
this.userDetails=result;
console.log("received user details in profile component constructor: ", this.userDetails);
})
}
}
结果仍然显示“原始值”而不是更新值。这是完全错误的方法还是我错误地处理了可观察值。帮助将不胜感激。
解决方案
您需要对服务进行一些更改才能使其正常工作。添加providedIn: root
和删除其他模块的所有声明。其次,您不需要this.userDetailsBS.asObservable()
并且可以直接在userDetailsBS
. 您的代码将如下所示。
服务:
@Injectable({
providedIn: 'root'
})
export class ProfileServices {
constructor() {}
userDetailsBS = new BehaviorSubject<any>('original value');
isLoggedIn: boolean;
loginlogout(userDetails: any, isLoggedIn: boolean) {
this.userDetailsBS.next(userDetails);
this.isLoggedIn = isLoggedIn;
}
getUserDetails() {
return this.userDetailsBS.getValue();
}
}
零件:
export class ProfileT1Component implements OnInit {
userDetails: any;
constructor(public profileService: ProfileServices) {
this.profileService.userDetailsBS.subscribe((result) => {
console.log(result);
this.userDetails = result;
console.log('received user details in profile component constructor: ', this.userDetails);
});
}
}
推荐阅读
- c++ - C/C++中结构体的序列化和反序列化
- python - 找到两个值之间的堆栈等级
- python - Python Pandas为特定行匹配条件设置值
- android - Android中的自动点击监听器
- javascript - Material-UI如何改变下划线和标签颜色
- json - 这个 JSON 是什么类型的格式,一个对象数组还是其他什么?
- powerbi - 在电源查询中转置多张工作表
- flutter - 如何在颤动中获得选定的芯片选择值
- javascript - 为什么数组在“按钮”类型中计数,但在 Handlebars 中的“模态体”类中不计数?
- go-gorm - 如何将 CREATE gorm 的数据获取到变量中