2017-01-23 7 views
6

Ich habe eine Angular-Komponente, die dynamisch verschiedene andere Arten von Komponenten in sich selbst erstellt. Es bindet seine eigenen Eigenschaften an untergeordnete Komponente @Input Eigenschaften über einen OnChanges Haken.Angular 2 OnPush Änderungserkennung für dynamische Komponenten

Diese Bindung funktioniert, wenn die Änderungserkennung der untergeordneten Komponente auf Standard festgelegt ist. Dann werden die neuen Eingaben erkannt und die Komponentenvorlage wird aktualisiert.

Es funktioniert jedoch nicht, wenn die Änderungserkennung OnPush ist, dann wird die Änderung nicht erkannt. Ich glaube, dass die Änderung erkannt werden sollte, da ein neues unveränderliches Objekt, eine Zeichenfolge, einer Komponente @Input Eigenschaft zugewiesen wird.

Hier ist ein Plunker demonstrieren: https://plnkr.co/edit/0wHQghtww2HXVbC27bC1

Wie kann ich diese Eltern-dynamic-Kind bekommen Eigentum Bindung mit ChangeDetectionStrategy.OnPush zu arbeiten?

+0

Für interessierte jedermann, Hier finden Sie das zugehörige GitHub-Problem mit weiteren Informationen darüber, warum die OnPush-Änderungserkennung für dynamische Komponenten anders funktioniert - https: //github.com/angular/angular/issues/14087 –

Antwort

3

Als mögliche Abhilfe für OnPush Komponente Setter unter Verwendung zusammen mit cdRef.markForCheck() würde:

Änderung erkennungs onpush.component.ts

@Component({ 
    selector: 'app-change-detection-onpush', 
    template: ` 
    <div> 
     ChangeDetectionStrategy.OnPush: {{ message || '[blank]' }} 
    </div>`, 
    changeDetection: ChangeDetectionStrategy.OnPush 
}) 
export class ChangeDetectionOnPushComponent implements IMyComponent { 
    private _message: string; 

    constructor(private cdRef: ChangeDetectorRef) {} 

    set message(val: string) { 
    this.cdRef.markForCheck(); 
    this._message = val; 
    } 

    get message() { 
    return this._message; 
    } 
} 

Modified Plunker

+0

Tolle Lösung, danke @yurzui –