2017-06-06 4 views
2

Ich habe ein Formular mit name und milestone Eingänge. Ich möchte, dass mein Eingabewert milestoneMilestone: + name ist und automatisch aktualisiert wird, wenn mein Benutzer einen Namen eingibt.Bind FormBuilder Eingangswert mit einem anderen Eingangswert

Ich versuche ngModel Bindung zu verwenden, um dies zu erreichen.

<!-- My name input --> 
<input mdInput [(ngModel)]="phaseName" formControlName="name" placeholder="Nom" required> 

Und in meinem ts Komponente Konstruktor:

public phaseForm: FormGroup; 
phaseName: string; 

this.phaseForm = fb.group({ 
     'name': ['', Validators.required], 
     'milestone': ['Milestone: ' + this.phaseName, Validators.required] 
    }); 

Aber als der Standardwert von Meilenstein im Konstruktor festgelegt ist, ist es nicht aktualisiert, wie mein Benutzer tippt einen Namen, was soll ich hinzufügen oder tun, um meine Bindung zu erreichen?

+0

nicht im Konstruktor initialisieren. Verwenden Sie 'ngOninit', um den Wert zu initialisieren, und verwenden Sie die Werte mit' this.phaseForm.value'. keine Notwendigkeit von 'ngModel' –

+0

Aber ich möchte den Wert geändert werden, wie der Benutzer – Christopher

+0

es ändert sich. schließlich. Überprüfen Sie, indem Sie {{pahseForm.value.name}} in Ihrem HTML-Code hinzufügen. In Ihrem .ts greifen Sie auf 'this.pahseForm.value.name' zu. –

Antwort

2

können Sie so einstellen. Nach dem Init-Formular-Generator in der ngOnInit() -Methode. Wenn Sie Eingabefeld in Formgroup verwenden können. Es ist bereits zwei Wege Bindung, so dass keine Notwendigkeit, einen Wert binden. wenn Sie einen Formularwert erhalten möchten.

for eg : const phaseFormValue = this.pahseForm.value; 
console.log(phaseFormValue.name); 

ngOnInit(): void { 
this.phaseForm.setValue({milestone:'Milestone: ' + this.phaseName}); 
} 

, wenn Sie Eingabefeld außerhalb verwenden können. dann probiere diesen Code aus.

<input mdInput [(ngModel)]="phaseName" (keypress)="handleKeyboardEvent($event)" placeholder="Name"> 

// Komponente

@HostListener('document:keypress', ['$event']) 
    handleKeyboardEvent(event: KeyboardEvent): void { 
      this.phaseForm.setValue({milestone:'Milestone: ' + this.phaseName}); 
    }; 
+0

Wie würde das helfen, den Wert des Meilensteins in Echtzeit an den Namen zu binden? – Christopher

+0

Sie müssen ngModel entfernen und (datengesteuerte Methode) formControlName ist Zwei-Wege-Bindung. –

+0

@Chris Sie können phaseName Eingabefeld im Formular oder außerhalb verwendet werden? –

0

Html

<input mdInput formControlName="name" placeholder="Nom" required> 

* no need of ngModel 

Komponente

Wert erhalten

this.phaseForm.value

und Veränderungen erkennen Sie

this.phaseForm.valueChanges .subscribe(data => this.onValueChanged(data));

für die einzelne Eigenschaft tun, könnten Sie tun, wie

nameChangeLog: string[] = []; 
logNameChange() { 
    const nameControl = this.heroForm.get('name'); 
    nameControl.valueChanges.forEach(
    (value: string) => this.nameChangeLog.push(value) 
); 
} 

Kontrolle der cookbook here

Sie Wert initialisieren kann wie vorgeschlagen von Shailesh Ladumor oder an der Stelle, wo Sie die initialisieren bilden.

+0

Aber das würde Änderungen auf allen Feldern meines Formulars abfangen, wie kann ich ein einzelnes Feld (z. B. Name) gezielt? – Christopher

+0

@Chris. Ich habe meine Antwort aktualisiert –

Verwandte Themen