Bidirektionale Datenbindung für eine Komponenteneingabeeigenschaft

8

Ich versuche, etwas an eckig2 zu arbeiten, und ich kann nichts über dieses Verhalten herausfinden.

Ich habe eine Anwendung, die eine benutzerdefinierte Komponente wie diese implementiert:

%Vor%

Und ich versuche, eine bidirektionale Datenbindung für meine inputText -Variable von meiner Komponente aus zu machen:

%Vor%

Dabei ist testString eine Variable, die in MyApp.ts definiert ist und eine Zeichenfolge enthält. Ich möchte, dass meine testString Variable geändert wird, wenn mein inputText vom Benutzer geändert wird.

Hier ist ein Plunker mit einem einfachen Beispielcode: Ссылка

Gibt es eine Möglichkeit, das einfach zu machen? Muss ich eine Angular2-Klasse für meine benutzerdefinierten Komponenten und Überladungsfunktionen implementieren, damit dies wie ein ngModel funktioniert? Muss ich unbedingt eine inputTextChanged Variable vom Typ EventEmitter erstellen, die meine Daten ausgibt, wenn sie geändert wird und so etwas wie folgt macht:

%Vor%

Vielen Dank im Voraus.

    
David Gonzalez 05.01.2016, 09:59
quelle

4 Antworten

14

Dies wird in der Vorlage Syntax doc, in der Zwei-Wege-Bindung erklärt mit NgModel Abschnitt:

  

<input [(ngModel)]="currentHero.firstName">

     

Intern ordnet Angular den Begriff ngModel einer Eingabeeigenschaft ngModel und einer Ausgabeeigenschaft ngModelChange zu. Dies ist ein spezifisches Beispiel für ein allgemeineres Muster, in dem es [(x)] mit einer x -Eingabeeigenschaft für die Eigenschaftsbindung und einer xChange -Ausgabefunktion für die Ereignisbindung übereinstimmt.

     

Wir können unsere eigene bidirektionale verbindliche Richtlinie / Komponente schreiben, die diesem Muster folgt, wenn wir dazu in der Lage sind.

Beachten Sie auch, dass [(x)] nur syntaktischer Zucker für eine Eigenschaftenbindung und eine Ereignisbindung ist:

%Vor%

In Ihrem Fall möchten Sie

%Vor%

Ihre Komponente muss also eine inputText -Eingangseigenschaft und eine inputTextChange -Ausgabefunktion haben (was EventEmitter ist).

%Vor%

Um das übergeordnete Element zu benachrichtigen, geben Sie, wenn Ihre Komponente den Wert von inputText ändert, ein Ereignis aus:

%Vor%

In Ihrem Szenario bindet die MyComp-Komponente die Eingabeeigenschaft inputText mit dem [(x)] -Format an ngModel. Daher haben Sie die Ereignisbindung (ngModelChange) verwendet, um über Änderungen benachrichtigt zu werden, und in dieser Ereignisbehandlungsroutine haben Sie die übergeordnete Komponente benachrichtigt die Veränderung.

In anderen Szenarien, in denen ngModel nicht verwendet wird, ist es wichtig, dass emit() ein Ereignis ist, wenn sich der Wert der Eigenschaft inputText in der MyComp-Komponente ändert.

    
Mark Rajcok 05.01.2016, 16:28
quelle
6

Ich werde @pixelbits und @ Günter Zöchbauer Antworten und Kommentare kombinieren, um eine klare Antwort auf meine Frage zu geben, wenn jemand in der Zukunft danach sucht.

Damit die bidirektionale Datenbindung an benutzerdefinierten Variablen funktioniert, müssen Sie Ihre Komponente basierend auf den folgenden Komponenten erstellen:

MyComp.ts-Datei:

%Vor%

MyApp.ts-Datei:

%Vor%

Dort funktioniert die bidirektionale Datenbindung an die Variable inputText korrekt. Sie können die Antwort für eine schönere oder einfachere Art, diesen Code zu implementieren, kommentieren.

    
David Gonzalez 05.01.2016 10:30
quelle
1

Ihr Plunker enthält bereits EventEmitter . Die @Output() Annotation fehlt. Um den Wert zu ändern, rufen Sie inputTextChanged.emit(newValue) auf (dies ändert auch den Wert von inputText )

    
Günter Zöchbauer 05.01.2016 10:08
quelle
-1

Was ich tue, ist eine Eigenschaft, also wenn ich die Daten ändere, wird die Änderung automatisch ausgegeben

%Vor%

In HTML binden Sie die Eigenschaft mit [(data)]

%Vor%     
Julián Mesa 21.03.2018 09:18
quelle