Angular 2异步管道不会使用Observable渲染新值

Angular 2异步管道不会使用Observable渲染新值,angular,typescript,pipe,ngrx,Angular,Typescript,Pipe,Ngrx,我正在我的应用程序中使用NgRx商店 Home.html <list-objects [array]="array| async" (Edit)="Edit($event)" (Delete)="Delete($event)" ></list-objects> Home.ts export class HomePage { public array: Observable<itm[]>; con

我正在我的应用程序中使用NgRx商店

Home.html

<list-objects
      [array]="array| async"
      (Edit)="Edit($event)"
      (Delete)="Delete($event)"
 ></list-objects>

Home.ts

export class HomePage {
     public array: Observable<itm[]>;

     constructor(){
          this.array= this.store.select(state => state.array);

          this.array.subscribe((a) => {
             console.log(a); //VALUES OK
          }
      }

      Edit(event){
          this.store.dispatch(this.actions.updateItem(event.item));
      }
  }
导出类主页{
公共阵列:可观测;
构造函数(){
this.array=this.store.select(state=>state.array);
this.array.subscribe((a)=>{
console.log(a);//值正常
}
}
编辑(事件){
this.store.dispatch(this.actions.updateItem(event.item));
}
}
编辑数组项时,异步管道不会更新视图,但“数组”对象中的值会被更正(订阅中的console.log会显示更新的值)。单击DOM中的某个位置(打开模式,单击按钮…)时,视图会更新为新值


我还登录到子组件“ngOnChanges”,它不会以新值启动。

尝试以下操作:

(注意此代码未经测试)


导出类主页{
公共数组:itm[];
建造商(专用区:NgZone){
this.store.select(state=>state.array).subscribe((a)=>{
此.zone.run(()=>{
this.array=a;
});
}
}
编辑(事件){
this.store.dispatch(this.actions.updateItem(event.item));
}
}
我已经从模板中删除了异步管道,并直接分配了数组。在this.zone.run内执行此操作,将触发摘要循环,并重新呈现模板

摘要周期通常仅在一些预定义的情况下触发,例如Http方法回调、UI输入。此处没有任何情况发生,因此Angular不知道如何更新。

请尝试:

constructor(private changeDetector: ChangeDetectorRef) {
              this.array= this.store.select(state => state.array);

              this.array.subscribe((a) => {
                 console.log(a); //VALUES OK
                 this.changeDetector.markForCheck();
              }
          }

更改检测不是由ngrx store自动触发的(也不应该),因此您不会看到UI更新。只有几个东西会自动触发更改检测:UI输入(单击、按键等)、HTTP响应、计时器(设置超时和设置间隔)

您可以通过两种方式解决问题:

  • 启用
    changeDetection:ChangeDetectionStrategy.OnPush
    ,然后使用subscribe显式更新数组,在这种情况下,您需要调用
    markForCheck()

  • 第二种方法是注入
    ChangeDetectorRef
    并在subscribe中调用
    detectChanges()
    。但不要这样做。也不要对其使用
    NgZone


  • ngrx+ChangeDetectionStrategy.OnPush
    是提高更改检测性能的好方法。

    这个.store是什么?服务?它代表我的应用程序的状态。“从'@ngrx/store'导入{store};”你能发布你的减速机吗?问题中的代码似乎不完整;在没有初始化的情况下,你如何使用
    this.store
    ?你能发布更完整/具有代表性的代码吗?在什么情况下异步管道不工作,需要区域样板?这有点令人不安Angular之外的东西将东西推入的地方。Angular不知道发生了什么。内部Angular类会在引擎盖下运行zone.run来触发摘要(就像使用Http服务时)。这很令人沮丧。我最近也经历过同样的与异步管道的斗争。例如,感谢关于如何解决问题的讨论,但我们应该使用异步管道-这是最佳实践。我在没有使用NgRx存储的情况下遇到了非常类似的问题,但仍然不知道问题出在哪里。为什么要将其标记为down?????这是标记更改的一种方法第二次启动摘要循环。请尝试。不要使用区域。您需要按更改检测器循环放置它。
    constructor(private changeDetector: ChangeDetectorRef) {
                  this.array= this.store.select(state => state.array);
    
                  this.array.subscribe((a) => {
                     console.log(a); //VALUES OK
                     this.changeDetector.markForCheck();
                  }
              }
    
    import { ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core';
    
    
    @Component({
        ...,
        changeDetection: ChangeDetectionStrategy.OnPush
    })
    export class HomePage {
        public array: itm[];
        constructor(private ref: ChangeDetectorRef) {
            this.store.select(state => state.array).subscribe(a => {
                this.arr = a;
                this.ref.markForCheck();
            });
        }
    }