Próbowałem już pójść za przykładem innych odpowiedzi stąd i nie udało mi się!
Utworzyłem formularz reaktywny (tj. Dynamiczny) i chcę w dowolnym momencie wyłączyć niektóre pola. Mój kod formularza:
this.form = this._fb.group({
name: ['', Validators.required],
options: this._fb.array([])
});
const control = <FormArray>this.form.controls['options'];
control.push(this._fb.group({
value: ['']
}));
mój html:
<div class='row' formArrayName="options">
<div *ngFor="let opt of form.controls.options.controls; let i=index">
<div [formGroupName]="i">
<select formArrayName="value">
<option></option>
<option>{{ opt.controls.value }}</option>
</select>
</div>
</div>
</div>
Skróciłem kod, aby ułatwić. Chcę wyłączyć pole wyboru typu. Próbowałem wykonać następujące czynności:
form = new FormGroup({
first: new FormControl({value: '', disabled: true}, Validators.required),
});
nie działa! Ktokolwiek ma jakieś sugestie?
first
? `:)value
nie jest formArray, to formControlName. Jeśli chceszvalue
być formArray, musisz to zmienić. Obecnie jest to formControlName. Więc jeśli chcesz, aby całe pole wyboru zostało wyłączone, po prostu zmień<select formArrayName="value">
na<select formControlName="value">
Odpowiedzi:
lub
źródło
if
instrukcji. Po przesłaniu formularza cały formularz jest ponownie wyłączany.Zwróć uwagę
Jeśli tworzysz formularz używając zmiennej warunku i próbujesz go później zmienić, to nie zadziała, tj . Forma się nie zmieni .
Na przykład
i jeśli zmienisz zmienną
forma nie ulegnie zmianie. Powinieneś użyć
BTW.
Do zmiany wartości należy użyć metody patchValue:
źródło
Używanie wyłączania w DOM z formularzami reaktywnymi jest złą praktyką. Możesz ustawić tę opcję w swoim
FormControl
, podczas inicjowania pliku fromNieruchomość
value
nie jest koniecznaLub możesz uzyskać kontrolę nad formularzem za pomocą
get('control_name')
i ustawićdisable
źródło
It looks like you’re using the disabled attribute with a reactive form directive. If you set disabled to true when you set up this control in your component class, the disabled attribute will actually be set in the DOM for you. We recommend using this approach to avoid ‘changed after checked’ errors
. Dlatego zalecany sposób zmiany stanu wyłączenia / włączenia bezpośrednio za pomocą elementów sterujących. Możesz również sprawdzić ten wspaniały temat netbasal.com/…Rozwiązałem to, owijając mój obiekt wejściowy etykietą w zestawie pól: Zestaw pól powinien mieć właściwość disabled powiązaną z wartością logiczną
źródło
disabling
FormControlprevents
, że jest obecny w postaci whilesaving
. Możesz po prostu ustawićreadonly
właściwość.Możesz to osiągnąć w ten sposób:
HTML:
TS:
Znalazłem to tutaj
źródło
form.getRawValue()
aby dołączyć wyłączone wartości kontrolneJeśli użyć
disabled
elementów wejściowych formularza (jak sugerowano w poprawnej odpowiedzi, jak wyłączyć wprowadzanie ), ich walidacja również zostanie wyłączona, zwróć na to uwagę!(A jeśli używasz przycisku przesyłania,
[disabled]="!form.valid"
co spowoduje wykluczenie pola z walidacji)źródło
Byłoby bardziej ogólne podejście.
źródło
Jeśli chcesz wyłączyć
first
(formcontrol), możesz użyć poniższej instrukcji.this.form.first.disable();
źródło
To zadziałało dla mnie:
this.form.get('first').disable({onlySelf: true});
źródło
Lub formcontrol „pierwszy”
Możesz wyłączyć lub włączyć na początkowym ustawieniu.
źródło
źródło
Najlepsze rozwiązanie jest tutaj:
https://netbasal.com/disiring-form-controls-when-working-with-reactive-forms-in-angular-549dd7b42110
Zarys rozwiązania (w przypadku niedziałającego linku):
(1) Utwórz dyrektywę
(2) Używaj go w ten sposób
(3) Ponieważ wyłączone dane wejściowe nie są wyświetlane w form.value podczas przesyłania, może być konieczne użycie następujących zamiast tego (jeśli jest to wymagane):
źródło
this.form.get('FIELD_NAME').patchValue(DYNAMIC_VALUE)
pokazuję formControl. kiedy przeszedł do dyrektywy, pokazuje Cannot read property 'disable' of undefinedMiałem ten sam problem, ale wywołanie this.form.controls ['name']. Disable () nie rozwiązało problemu, ponieważ ładowałem ponownie widok (używając router.navigate ()).
W moim przypadku musiałem zresetować mój formularz przed ponownym załadowaniem:
this.form = undefined; this.router.navigate ([ścieżka]);
źródło
źródło
Możesz zadeklarować funkcję, aby włączyć / wyłączyć całą kontrolkę formularza:
i używaj go w ten sposób
źródło
Aby dokonać pole Wyłącz i pozwalają na postaci reaktywnej kątowego 2+
1. Aby wyłączyć
<input class="form-control" name="Firstname" formControlName="firstname" [attr.disabled]="true">
Umożliwić
Włącz cały formularz
this.formname.enable();
Włącz tylko określone pole
this.formname.controls.firstname.enable();
To działa dobrze. Komentarz do zapytań.
źródło