我有一个相当大的数据列表,每个元素都应用了一个过滤器。出于性能原因(我想为每个条目添加很多属性)我只想在数据更改时更新列表(如果更新它是不正常的,那就没问题了)。不幸的是,每当我点击某些东西时,Angular 2中的OnPush ChangeStrategy仍会更新。
有没有办法只手动触发更新/检查(例如使用changeDetectorRef.markForCheck()
)而不是每次点击事件都自动触发?
AngularJS(1.5)和Angular 2都很好。
答案 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}}
(因此它的视图)每秒都会更新,正如预期的那样。