Angular 2-Komponenten: Umgang mit kreisförmigen Ein- und Ausgängen

Momentane Situation

Ich habe einparent und einchild component.

Dasparent initialisiert daschild 's Daten mit seiner@Input. Und diechild benachrichtigt das übergeordnete Element, wenn der Benutzer die Daten mit @ bearbeitet ha@Output. Und weil dasdata ist unveränderlich, daschild muss die Daten zusammen mit dieser Benachrichtigung senden.

Wenn dieparent wurde benachrichtigt, prüft, ob die übermittelten Daten gültig sind, und legt sie dann fest (dies gibt den neuen Wert auch an einige andere untergeordnete Komponenten weiter).

Das Problem

Beim Einstellen der neuen Daten imparent wird es natürlich auch an die @ gebchild -Komponente, die gerade die Daten übermittelt hat. Dies wird das @ auslöschild 'sngOnChanges, was dann ein Repaint der Benutzeroberfläche auslöst.

Einiger Hintergrund:

Dasparent hat mehrere verschiedenechild Komponenten, die alle auf dem gleichen @ beruhmyItem Daten und können diese Daten bearbeiten und dann das @ benachrichtigparent bei Änderung

Hier ist eine vereinfachte Version des Codes, die das Problem aufzeigen sollte.

Parent Component:

template:
    <child [input]="myItem" (output)="onMyItemChange($event)">

code:
    ngOnInit() {
        this.myItem = getDataViaHTTP();
    }

    onMyItemChange($event) {
        if($event.myItem.isValid()) {
            this.myItem = $event.myItem;
        }
    }

Kinderkomponente:

template:
    <input [(ngModel)]="myItem.name" (ngModelChange)="modelChange($event)">

code:
    @Input() input;
    @Output() output = new EventEmitter();

    myItem;

    ngOnChanges(changes) {
        this.myItem = changes.input.currentValue.toMutableJS();
    }

    modelChange($event) {
        this.output.emit(this.myItem.toImmutableJS())
    }

Wie Sie sehen können, diechild -Komponente übernimmt die Daten aus dem@Input und macht es veränderlich. Und vor dem Zurücksenden an dasparent es wird es wieder unveränderlich machen.

Gibt es ein Muster, um diese zirkulären Ereignisse zu verhindern?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage