2016-08-04 27 views
2

So aktualisieren Sie den JSON-Wert ' von einer untergeordneten Komponente zur übergeordneten Komponente. Wenn ich versuche, den Wert vom Kindmodell mit Ausgabeereignis in eine Elternkomponente zu aktualisieren, funktioniert nichts.Angular 2 [typescript] Aktualisieren eines Modellwerts der UI der übergeordneten Komponente von einer untergeordneten Komponenten-UI mit dem JSON-Modell

i all Details unten angegebene

Daten behandelt:

json: [{ 
     "inp": "hello", 
     "oup": "fello" 
}] 

Stammkomponente

// Parent Component 
@Component({ 
selector: 'parent', 
template: ` 
    <div>Parent sharedVarParent: {{sharedVarParent[0].oup}} 
    <input type="text" [ngModel]="sharedVarParent[0].oup"/> 
    </div> 
    <child [(sharedVar)]="sharedVarParent"></child> 

     `, 
    directives: [ChildComponent] 
}) 
export class ParentComponent { 
    sharedVarParent =[{ 
        "inp": "hello", 
        "oup": "fello" 
        }] 

    constructor() { console.clear(); } 
} 

childcomponent

import {Component, EventEmitter, Input, Output} from 'angular2/core' 

    // Child Component 
    @Component({ 
    selector: 'child', 
    template: ` 
    <p>Child sharedVar: {{sharedVar[0].oup}}</p> 
    <input [ngModel]="sharedVar[0].oup" (ngModelChange)="change($event)"> 
    ` 
    }) 
    export class ChildComponent { 
    @Input() sharedVar: string; 
    @Output() sharedVarChange = new EventEmitter(); 
    change(newValue) { 
     console.log('newvalue', newValue) 
     this.sharedVar = newValue; 
     this.sharedVarChange.emit(newValue); 
    } 
} 
+0

Du es als String deklarieren, wenn es wirklich ist es 'Array ' oder ein Array von welcher Art auch immer hat ‚inp‘ und ‚oup‘ Eigenschaften. Ich glaube nicht, dass das das Problem ist. Es sieht so aus, als würden Sie das Modell des Inputs auf die Eigenschaft 'oup' des ersten Elements im Array (eine Zeichenkette) setzen und dieses in der Änderung ausgeben. Würden Sie 'sharedVarParent' (ein Array von Objekten) nicht mit dem String-Wert überschreiben, der in die Eingabe eingegeben wurde? –

+0

@JasonGoemaat auch nach dem Ändern des Datentyps @Input() sharedVar: Array Problem beendet, andere Vorschläge bitte ?. Vielen Dank. –

+0

Es scheint, dass Angular eine nutbox-Eingabe * für Primitive * nicht bestätigt, wie sie einem Elternteil zugeordnet sind. '' funktioniert, da der primitive Wert ('notes: string') vom Namespace eines Objekts ausgeschlossen wird; aber 'scheint den Bezug zu den Eltern & Großeltern zu verlieren. Dies ist nicht anders als in Angular1.x, wenn Sie ein dummes Objekt verwenden mussten, nur um die Datenbindung am Leben zu erhalten. Aber wie konnten sie das in ng2 übersehen haben ??? Ich schätze, du musst den 'ControlValueAccessor' benutzen. – Cody

Antwort

2

Diese seltsam mir ein bisschen aussieht. Sie weisen dem Eingang den Wert fello zu und geben den aktualisierten Wert aus. Es scheint mir, wollen Sie die sharedVar

<input [(ngModel)]="sharedVar[0].oup" (ngModelChange)="change()"> 
change() { 
    this.sharedVarChange.emit(sharedVar); 
} 
+0

Ich habe versucht, Ihre Lösung, es aktualisiert das UI-Modell auf der übergeordneten Komponente nicht. Irgendein Vorschlag, um dieses Szenario zu erreichen, danke. –

+0

Können Sie einen Plunker zur Reproduktion und Untersuchung bereitstellen? (Vorlage https://angular.io/resources/live-examples/quickstart/ts/plnrr.html) –

+0

können Sie unter http://plnkr.co/edit/PJqvLs?p=preview in Anspruch nehmen. Bitte überprüfen Sie es, danke –

1

stattdessen geändert auszusenden Gibt es einen Grund, warum Sie Ihre Array als Eingabe, statt nur die Zeichenfolge senden? plnkr

bei your sample Blick gibt es ein paar seltsamen Dinge:

  1. Ihre Eltern Eingang ist eine Einbahn Bindung, ich weiß nicht, ob das Sie ist verwirrend, es ist ungewöhnlich, und fügt Verwirrung auf die Frage (fixed)

    <input [(ngModel)]="sharedVarParent[0].oup"/> 
    
  2. da das Array durch Verweis als Eingabe übergeben wird, gibt es nicht wirklich eine Notwendigkeit für eine Leistung Ihres Kindes Komponente, wenn Sie ein neues Array erstellen, nur zwei-Wege-Bindung verwenden am Eingang in Ihrem Kind, und es wird die Eigenschaft auf dem ersten Objekt in dem gemeinsamen Array (sample)

    <input [(ngModel)]="sharedVar[0].oup"> 
    
      aktualisiert
    1. Sie Mischen den sharedVar Array als Eingabe vorbei und eine Ausgabe von Zeichenfolge vom Emitter, wenn der Textfeldwert des untergeordneten Elements aktualisiert wird. Wenn das passiert, ändert sich die Bindung im Elternteil sharedVarParent zu einer Zeichenkette, die das Ganze durcheinander bringt. Wenn der Elternteil das Kind instanziiert, setzt er die Eingabe sharedVar auf das Array. Wenn Sie das Textfeld des untergeordneten Elements eingeben, wird eine Zeichenfolge ausgegeben, und das übergeordnete Element ändert sharedVarParent in eine Zeichenfolge, die dann als Eingabe an das untergeordnete Element gesendet wird. plnkr