我正在尝试对“行为”主题进行锻炼。请找到以下片段。
dashboard.component.js
export class DashboardComponent implements OnInit {
inputObjResponse = [];
constructor(private http: Http, private GetjsondataService: GetjsondataService) { }
ngOnInit() {
var that = this;
this.GetjsondataService.getValuesFromJson()
this.GetjsondataService.data.subscribe(
data => {console.log("new data1",data);this.inputObjResponse = data},
error => console.log(error),
() => console.log("completed")
)
}}
header.component.js
export class HeaderComponent implements OnInit {
constructor(private GetjsondataService: GetjsondataService) { }
ngOnInit() {
this.GetjsondataService.data.subscribe(
data => {console.log("new data1",data)},
error => console.log(error),
() => {
console.log("completed in header");
this.GetjsondataService.setJsonvaluesToShare("")
}
)
}}
getjsondata.service.ts
export class GetjsondataService {
inputObjResponse:any;
public source = new BehaviorSubject<any>('');
data = this.source.asObservable();
constructor(private http:Http) { }
getValuesFromJson() {
this.http.get('./json/inputjson.json')
.map((response:Response) => response.json())
.subscribe(
data => this.inputObjResponse = data,
error => console.log('#1 Error:', error),
() => {
console.log(this.inputObjResponse);
this.source.next(this.inputObjResponse)
this.source.complete();
}
);
}
setJsonvaluesToShare(inputjsonrespose) {
this.source.next(inputjsonrespose)
this.source.complete();
console.log(inputjsonrespose)
}}
我现在得到以下结果。
到目前为止,按照我对行为主题的理解,一切都在正常运行。但是当我尝试使用
再次更新值时this.GetjsondataService.setJsonvaluesToShare("")
在标头组件的完整功能中,该值不会在仪表板和标头组件中更新。
我不确定为什么不更新该值,请在我理解逻辑错误的地方指导我。
我已尽我所能清楚地解释了它,如果有任何不清楚的地方,我可以进一步解释。
答案 0 :(得分:3)
来自文档
onCompleted()通知观察者可观察对象已完成 发送基于推送的通知。
因此,它将有效地“关闭”主题,如您所言,将不会进行其他限制。删除
this.source.complete();
答案 1 :(得分:0)
正如@Antoniossss所指出的那样, complete()关闭流,您将不会获得行为主体的最新值。
如果要从Observable获取最新值,则需要将该Subject保持打开状态。另外,请确保取消订阅组件中的订阅(在大多数情况下,您将希望在OnDestroy Angular挂钩中进行订阅-通过取消订阅对象或使用RxJS运算符,例如 takeUntil 或 takeWhile )。