Angular 角度观测值不自动更新

Angular 角度观测值不自动更新,angular,observable,behaviorsubject,Angular,Observable,Behaviorsubject,我有一个向其传递值的服务,因此该值可供所有需要它的组件使用: setAnalysisStatus(statuses: AsyncAnalysis[]) { this.analysisStatus.next(statuses); } 我有一个组件,通过点击按钮显示。显示的组件调用另一个方法来订阅analysisStatus getAnalysisStatus(): Observable<AsyncAnalysis[]> { return this.anal

我有一个向其传递值的服务,因此该值可供所有需要它的组件使用:

  setAnalysisStatus(statuses: AsyncAnalysis[]) {
    this.analysisStatus.next(statuses);
  }
我有一个组件,通过点击按钮显示。显示的组件调用另一个方法来订阅
analysisStatus

  getAnalysisStatus(): Observable<AsyncAnalysis[]> {
    return this.analysisStatus.asObservable();
  }
当我触发该组件时,它显示
analysisStatus
的当前状态。但是,当该组件的状态更改时,该组件不会更新。如果我关闭然后重新打开该组件,它将显示新状态。我需要它显示状态,并在
analysisStatus
的状态更改时更新

analysisStatus
设置如下:

ngOnInit(){
this.changeGroupService.getAnalysisStatus()
.subscribe(result => {
  result.forEach(item => {
    this.changeGroupStatus.forEach((changeGroup, index) => {
      if (item.changeGroupId === changeGroup.id) {
        this.changeGroupStatus[index].name = this.changeGroupStatus[index].name;
        this.changeGroupStatus[index].status = item.status;
      }
    });
  });
});
}
analysisStatus=newbehaviorsubject([])

我的假设是通过
this.changeGroupService.getAnalysisStatus()
进行子循环,应该在
this.changeGroupStatus
中查找更新值。我错过什么了吗

编辑---


因此,在我的
ngOnInit
中检查
this.changeGroupService.getAnalysisStatus()
,我可以看到
结果的值实际上是根据需要更新的,但模板不会更新以反映更改。

模板中呈现的值似乎并不直接依赖于可观察值。此外,变量
changeGroupStatus
未分配新值。只更改了它的几个属性。Angular可能检测不到部分更改。在这些情况下,您可以尝试使用手动触发更改检测。试试下面的方法

从'rxjs'导入{pipe,Subject};
从“rxjs/operators”导入{takeUntil};
已销毁=新主题();
恩戈尼尼特(){
此.changeGroupService.getAnalysisStatus()管道(
takeUntil(这个被销毁了)
).订阅(结果=>{
result.forEach(项目=>{
this.changeGroupStatus.forEach((changeGroup,index)=>{
if(item.changeGroupId==changeGroup.id){
this.changeGroupStatus[index].name=this.changeGroupStatus[index].name;
this.changeGroupStatus[index].status=item.status;
}
});
});

this.cdr.detectChanges()//对不起,但是在嵌套循环中调用<代码> Debug更改<代码>当然会影响性能,可能会产生意想不到的效果。考虑移动到循环之外调用单个时间。另外一件事我还没有测试过,但是我相信,如果您使用<代码> map 或<代码>重新创建数组>减少< /代码>。你甚至不需要使用
ChangeDetectorRef
@developer033:这是一个有效的观点。我已经修改了代码。我不确定使用
map
/
reduce
是否会触发默认的更改检测。但这是一个好主意。请确保在之后销毁订阅离开组件,否则将导致内存泄漏。