2016-01-27 15 views
69

Questo mi sta facendo impazzire, sono sotto la pistola e non posso permettermi di passare un altro giorno intero su questo.Imposta manualmente valore per controllo FormBuilder

Sto provando a impostare manualmente un valore di controllo ('dept') all'interno del componente, e il suo funzionamento non funziona - anche i nuovi registri dei valori da gestire correttamente.

Ecco la FormBuilder Istanza:

initForm() { 
    this.form = this.fb.group({ 
    'name': ['', Validators.required], 
    'dept': ['', Validators.required], 
    'description': ['', Validators.required], 
    }); 
} 

Questo è il gestore di eventi che riceve il reparto selezionato:

deptSelected(selected: { id: string; text: string }) { 
    console.log(selected) // Shows proper selection! 

    // This is how I am trying to set the value 
    this.form.controls['dept'].value = selected.id; 
} 

Ora, quando il modulo viene inviato e ho disconnettersi this.form il campo è ancora vuoto! Ho visto altri ppl usare updateValue() ma questa è la versione beta.1 e non la vedo come un metodo valido per chiamare il controllo.

Ho anche provato a chiamare updateValueAndValidity() senza successo :(.

Vorrei solo usare ngControl="dept" sull'elemento modulo, come sto facendo con il resto della forma, ma la sua direttiva custom/componente.

<ng-select 
    [data]="dept" 
    [multiple]="false" 
    [items]="depts" 
    (selected)="deptSelected($event)" <!-- This is how the value gets to me --> 
    [placeholder]="'No Dept Selected'"></ng-select> 
+0

avevo incontrato situazione simile, lo scenario è stato il valore è stato impostato in http.get-subscribe e carica il valore del modulo, ma impostando la riga del valore che viene eseguita per prima, il subscribe viene realmente eseguito in seguito come asincrono. quindi impostando il valore nel subscribe assicurati che sia impostato. my2cents! – HydTechie

risposta

108

Aggiornato: 19/03/2017

this.form.controls['dept'].setValue(selected.id); 

VECCHIO:

Per ora siamo costretti a fare un tipo di getto:

(<Control>this.form.controls['dept']).updateValue(selected.id) 

Non molto elegante, sono d'accordo. Spero che questo sia migliorato nelle versioni future.

+6

Funziona bene, grazie. È inoltre necessario cancellare la convalida: '( this.form.controls ['dept']). SetErrors (null)' –

+3

O ancora 'this.form.get ('dept'). SetValue (selected.id)':) – developer033

7

si potrebbe provare questo:

deptSelected(selected: { id: string; text: string }) { 
    console.log(selected) // Shows proper selection! 

    // This is how I am trying to set the value 
    this.form.controls['dept'].updateValue(selected.id); 
} 

Per maggiori dettagli, si potrebbe avere uno sguardo al corrispondente Doc JS per quanto riguarda la s Parametro econd del metodo updateValue: https://github.com/angular/angular/blob/master/modules/angular2/src/common/forms/model.ts#L269.

speranza che heps voi, Thierry

+0

Grazie per la tua risposta - tuttavia updateValue non sembra essere un metodo valido in angular2 beta.1 - Di quale versione sei in grado di utilizzare tale metodo? –

+1

Il typescript restituisce il seguente errore: 'errore TS2339: la proprietà 'updateValue' non esiste sul tipo 'AbstractControl''. In quel componente, il form ha il tipo di 'ControlGroup'. Forse se li creo singolarmente con 'new Control()' questo dovrebbe funzionare –

+0

Sì, è un metodo della classe 'Control' ... –

71

In Angular 2 Final (RC5 +) ci sono nuove API per l'aggiornamento dei valori del modulo. Il metodo patchValue() API supporta aggiornamenti forma parziale, dove abbiamo solo bisogno di specificare alcuni dei campi:

this.form.patchValue({id: selected.id}) 

C'è anche il metodo setValue() API che ha bisogno di un oggetto con tutti i campi del modulo. Se manca un campo, avremo un errore.

+6

Solo per aggiungere che a partire da ora 'updateValue' (dalla risposta accettata di Filoche) viene deprecato a favore di' setValue' – superjos

+2

Ecco la [richiesta di pull ufficiale] (https://github.com/angular/angular/ pull/10537) su Github e la logica per deprecare 'updateValue()' e introdurre 'patchValue' e' setValue'. – TheBrockEllis

3
let cloneObj = Object.assign({}, this.form.getRawValue(), someClass); 
    this.form.complexForm.patchValue(cloneObj); 

Se non si desidera impostare manualmente ciascun campo.

1

@ Filoche's Angular 2 soluzione aggiornata. Utilizzando FormControl

(<Control>this.form.controls['dept']).updateValue(selected.id)

import { FormControl } from '@angular/forms'; 

(<FormControl>this.form.controls['dept']).setValue(selected.id)); 

In alternativa è possibile utilizzare @ di solution AngularUniversity che utilizza patchValue