AngularJS或Angular 2中的手动变化检测?

时间:2016-03-26 02:39:02

标签: angularjs angular

我有一个相当大的数据列表,每个元素都应用了一个过滤器。出于性能原因(我想为每个条目添加很多属性)我只想在数据更改时更新列表(如果更新它是不正常的,那就没问题了)。不幸的是,每当我点击某些东西时,Angular 2中的OnPush ChangeStrategy仍会更新。

有没有办法只手动触发更新/检查(例如使用changeDetectorRef.markForCheck())而不是每次点击事件都自动触发?

AngularJS(1.5)和Angular 2都很好。

1 个答案:

答案 0 :(得分:1)

这应该有用(至少它在 Plunker 中):

@Component({
  selector: 'manual',
  template: `<br>manual: {{_counter.obj.counter}}
  <br><button (click)="0">click me</button>
    <li *ngFor="#item of items">{{item}}</li>`,
})
export class Manual {
  items = 'one two'.split(' ');
  constructor(private ref: ChangeDetectorRef, private _counter:Counter) {}
  ngOnInit() {
     this.ref.detach();
     setInterval(_ => {
        this.items.push(`CD ran when counter=${this._counter.obj.counter}`);
        this.ref.reattach();
        this.ref.detectChanges();
        this.ref.detach();
     }, 3000);
  }
}

在plunker中我有一个Counter服务,每秒更新obj.counter。在手动组件中,{{_counter.obj.counter}}(因此视图)仅在调用detectChanges()时更新 - 每3秒更新一次。单击click me按钮不会导致视图根据需要更新。

我没有指定OnPush。但是,如果这样做,它似乎不会改变所需的操作。

在plunker中我也有一个自动组件,它的{{_counter.obj.counter}}(因此它的视图)每秒都会更新,正如预期的那样。