2016-01-27 6 views
69

To doprowadza mnie do szału, jestem pod bronią i nie mogę pozwolić sobie na spędzanie całego dnia na tym.Ręcznie ustawiona wartość dla FormBuilder Control

Próbuję ręcznie ustawić wartość kontrolną ("dept") w komponencie, a jej po prostu nie działa - nawet nowe logi wartości do konsoli prawidłowo.

Oto FormBuilder Instance:

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

To obsługi zdarzeń, które odbiera wybraną dept:

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; 
} 

Teraz, gdy formularz jest składany i wylogować this.form pole jest nadal pusty! Widziałem inne użycie ppl updateValue(), ale jest to wersja beta.1 i nie widzę tego jako prawidłowej metody wywoływania kontroli.

Próbowałem również zadzwonić updateValueAndValidity() bezskutecznie :(.

chciałbym po prostu użyć ngControl="dept" na elemencie formularza, jak robię z resztą postaci, ale jego dyrektywy zwyczaj/komponentu.

<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

ja napotkasz podobnej sytuacji, scenariusz został wartość została ustalona w http.get subskrybowania i wczytaj wartość formularza, ale ustawiając najpierw wykonywanie linii wartości, subskrybowanie zostanie wykonane później jako asynchroniczne. więc ustawienie wartości w subskrypcji upewnij się, że jej zestaw. my2cents! – HydTechie

Odpowiedz

108

Aktualizacja: 19/03/2017

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

OLD:

Na razie jesteśmy zmuszeni zrobić to typ obsady:

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

Niezbyt elegancko Zgadzam się. Mam nadzieję, że to się poprawi w przyszłych wersjach.

+6

Działa to dobrze, dzięki. Należy również usunąć walidacji.. '( this.form.controls [ 'dept']) setErrors (null)' –

+3

Albo jeszcze 'this.form.get ('dept') setValue (selected.id)':) – developer033

7

można spróbować to:

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); 
} 

Aby uzyskać więcej informacji, można spojrzeć na odpowiednim JS Doc dotyczącą s Parametr econd metody updateValue: https://github.com/angular/angular/blob/master/modules/angular2/src/common/forms/model.ts#L269.

nadzieję, że heps ty, Thierry

+0

Dzięki za odpowiedź - jednak updateValue nie wydaje się być prawidłowy sposób w angular2 beta.1 - Która wersja jesteś na które jesteś w stanie używać tej metody? –

+1

Typescript daje następujący błąd: 'TS2339 błąd:„updateValue”nieruchomość nie istnieje w rodzaju„AbstractControl''. W tym komponencie formularz ma typ "ControlGroup". Może gdybym je tworzyć indywidualnie z 'nowej Kontroli()' to będzie działać –

+0

Tak, jest to metoda klasy 'Control' ... –

71

W Angular 2 Final (RC5 +) dostępne są nowe interfejsy API do aktualizowania wartości formularzy. Metoda patchValue() API obsługuje częściowych aktualizacji formularza, w którym należy określić tylko niektóre z dziedzin:

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

Istnieje również metoda setValue() API, które musi obiekt z wszystkich pól formularza. Jeśli brakuje pola, otrzymamy błąd.

+6

Wystarczy dodać, że od teraz 'updateValue' (od zaakceptowane odpowiedź przez Filoche) jest zastąpiona' setValue' – superjos

+2

Oto [oficjalna prośba przyciąganie] (https://github.com/angular/angular/ pull/10537) na Github i uzasadnienie wycofania 'updateValue()' i wprowadzenia 'patchValue' i' setValue'. – TheBrockEllis

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

Jeśli nie chcesz ręcznie ustawić każde pole.

1

@ Kątowymi 2 zaktualizowanej rozwiązania Filoche użytkownika. Korzystanie FormControl

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

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

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

Alternatywnie można użyć @ AngularUniversity na solution który wykorzystuje patchValue

Powiązane problemy