2016-03-26 14 views
1

Ich habe eine ziemlich große Liste von Daten und jedes Element hat einen Filter angewendet. Aus Performancegründen (Ich möchte jedem Eintrag viele Attribute hinzufügen) Ich möchte die Liste nur aktualisieren, wenn sich Daten ändern (es ist in Ordnung, wenn die Aktualisierung unperformant ist). Leider wird die OnPush ChangeStrategy in Angular 2 immer noch aktualisiert, wenn ich auf etwas klicke.Manuelle Änderungserkennung in AngularJS oder Angular 2?

Gibt es eine Möglichkeit, NUR Updates/Checks manuell auszulösen (z. B. mit changeDetectorRef.markForCheck()) und es nicht bei jedem Klickereignis automatisch zu haben?

Sowohl AngularJS (1.5) als auch Angular 2 sind in Ordnung.

+0

Die Änderungserkennung in Angular2 ist wesentlich effizienter als in AngularJS1.x. Sind Sie sicher, dass Ihre Anforderungen mit einer OnPush ChangeStrategy nicht erfüllt werden? –

+0

Siehe [Antwort] (http://stackoverflow.com/questions/34827334/triggering-angular2-change-detection-manual) –

+0

@EricMartinez Ich sah diesen Beitrag vor, aber das Problem ist, dass nur eine zusätzliche Änderung Erkennung auslöst . Ich möchte jedoch alle unnötigen Änderungsnachweise loswerden. In meinem Fall habe ich eine reine Pipe, die immer dann auslöst, wenn die Change-Erkennung auslöst. – Smaug

Antwort

1

Diese Arbeit sollte (zumindest tut es in diesem 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); 
    } 
} 

Im Plunker ich einen Zähler-Dienst haben, obj.counter jede Sekunde aktualisiert. In der Komponente Manual wird {{_counter.obj.counter}} (daher die Ansicht) nur aktualisiert, wenn alle 3 Sekunden detectChanges() aufgerufen wird. Wenn Sie auf die Schaltfläche click me klicken, wird die Ansicht nicht wie gewünscht aktualisiert.

Ich habe OnPush nicht angegeben. Wenn Sie dies jedoch tun, scheint es die gewünschte Operation nicht zu ändern.

Im Plocker habe ich auch eine automatische Komponente, und seine {{_counter.obj.counter}} (daher seine Ansicht) aktualisiert jede Sekunde, wie erwartet.