行为主题-值未更新-Angular 4

时间:2018-07-09 08:56:09

标签: angular rxjs observable

我正在尝试对“行为”主题进行锻炼。请找到以下片段。

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)
}}

我现在得到以下结果。

  • 最初在订阅日志的仪表板组件和标头组件中获取空值
  • 随后,在getjsondata服务中使用http服务将空值更新为对象。

到目前为止,按照我对行为主题的理解,一切都在正常运行。但是当我尝试使用

再次更新值时
this.GetjsondataService.setJsonvaluesToShare("")

在标头组件的完整功能中,该值不会在仪表板和标头组件中更新。

我不确定为什么不更新该值,请在我理解逻辑错误的地方指导我。

我已尽我所能清楚地解释了它,如果有任何不清楚的地方,我可以进一步解释。

2 个答案:

答案 0 :(得分:3)

来自文档

  

onCompleted()通知观察者可观察对象已完成   发送基于推送的通知。

因此,它将有效地“关闭”主题,如您所言,将不会进行其他限制。删除

this.source.complete();  

答案 1 :(得分:0)

正如@Antoniossss所指出的那样, complete()关闭流,您将不会获得行为主体的最新值。

如果要从Observable获取最新值,则需要将该Subject保持打开状态。另外,请确保取消订阅组件中的订阅(在大多数情况下,您将希望在OnDestroy Angular挂钩中进行订阅-通过取消订阅对象或使用RxJS运算符,例如 takeUntil takeWhile )。