Nonaktifkan kolom Input dalam bentuk reaktif

118

Saya sudah mencoba mengikuti contoh jawaban lain dari sini dan saya tidak berhasil!

Saya membuat formulir reaktif (yaitu, dinamis) dan saya ingin menonaktifkan beberapa bidang pada waktu tertentu. Kode formulir saya:

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: ['']
}));

html saya:

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

Saya mengurangi kode untuk memfasilitasi. Saya ingin menonaktifkan bidang tipe pilih. Saya mencoba melakukan hal berikut:

form = new FormGroup({
  first: new FormControl({value: '', disabled: true}, Validators.required),
});

tidak bekerja! Apakah ada yang punya saran?

Renato Souza de Oliveira
sumber
Bagaimana cara memilih dinonaktifkan, ketika Anda mencoba menonaktifkan beberapa formcontrol yang disebut first? `:)
AJT82
Itu hanya salah ketik. Saya ingin menonaktifkan pilih. Bisakah kamu membantuku?
Renato Souza de Oliveira
Bisakah Anda mereproduksi plunker?
AJT82
Apakah Anda mencoba menonaktifkan seluruh pilihan? Dan valuebukan formArray, ini adalah formControlName. Jika Anda ingin valuemenjadi formArray, Anda harus mengubahnya. Saat ini adalah formControlName. Jadi jika Anda ingin seluruh bidang pilih dinonaktifkan, cukup ubah <select formArrayName="value">ke<select formControlName="value">
AJT82

Jawaban:

223
name: [{value: '', disabled: true}, Validators.required],
name: [{value: '', disabled: this.isDisabled}, Validators.required],

atau

this.form.controls['name'].disable();
Joche Wis
sumber
jika saya menetapkan nilai seperti itu -> negara: [{value: this.address.country, disabled: true}] nilainya tidak terisi
Silvio Troia
Saya telah menggunakan teknik yang sama untuk menonaktifkan bidang yang diisi secara otomatis dari sumber tepercaya. Saya memiliki tombol untuk mengaktifkan / menonaktifkan formulir, dan setelah mengaktifkan seluruh formulir, saya biasanya menonaktifkan bidang tersebut menggunakan ifpernyataan. Setelah formulir dikirim, seluruh formulir dinonaktifkan sekali lagi.
ret0
72

Perhatian

Jika Anda membuat formulir menggunakan variabel untuk kondisi dan mencoba mengubahnya nanti, formulir tidak akan berfungsi, yaitu formulir tidak akan berubah .

Sebagai contoh

this.isDisabled = true;

this.cardForm = this.fb.group({
    'number': [{value: null, disabled: this.isDisabled},
});

dan jika Anda mengubah variabel

this.isDisabled = false;

bentuknya tidak akan berubah. Kamu harus menggunakan

this.cardForm.get ('number'). disable ();

BTW.

Anda harus menggunakan metode patchValue untuk mengubah nilai:

this.cardForm.patchValue({
    'number': '1703'
});
Dmitry Grinko
sumber
22

Merupakan praktik yang buruk untuk menggunakan disable di DOM dengan bentuk reaktif. Anda dapat menyetel opsi ini di FormControl, saat Anda memulai dari

username: new FormControl(
  {
    value: this.modelUser.Email,
    disabled: true
  },
  [
    Validators.required,
    Validators.minLength(3),
    Validators.maxLength(99)
  ]
);

Properti valuetidak perlu

Atau Anda bisa mendapatkan kontrol formulir Anda dengan get('control_name')dan mengaturdisable

this.userForm.get('username').disable();
Volodymyr Khmil
sumber
Mengapa praktik yang buruk menggunakan nonaktifkan di DOM dengan formulir reaktif?
pumpkinthehead
2
Anda akan mendapat peringatan dari sudut. 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. Jadi cara yang disarankan untuk mengubah status nonaktifkan / aktifkan secara langsung melalui kontrol. Juga, Anda dapat memeriksa topik hebat ini netbasal.com/…
Volodymyr Khmil
10

Saya menyelesaikannya dengan membungkus objek input saya dengan labelnya dalam satu set bidang: Fieldset harus memiliki properti yang dinonaktifkan terikat ke boolean

 <fieldset [disabled]="isAnonymous">
    <label class="control-label" for="firstName">FirstName</label>
    <input class="form-control" id="firstName" type="text" formControlName="firstName" />
 </fieldset>
Fernando M
sumber
1
membuang banyak waktu untuk mencari tahu cara menonaktifkan kontrol dalam bentuk reaktif, LOL! ini berhasil .. tidak diperlukan arahan atau kode tambahan. tepuk tangan 🍻
Nexus
7

The disablingFormControl preventsitu untuk hadir dalam bentuk sementara saving. Anda bisa mengaturnya sebagai readonlyproperti.

Dan Anda bisa mencapainya dengan cara ini:

HTML:

<select formArrayName="value" [readonly] = "disableSelect">

TS:

this.disbaleSelect = true;

Temukan ini di sini

Alex Po
sumber
2
Anda dapat menggunakan form.getRawValue()untuk menyertakan nilai kontrol yang dinonaktifkan
Murhaf Sousli
6

Jika akan menggunakan disabledelemen input formulir (seperti yang disarankan dalam jawaban yang benar bagaimana menonaktifkan input ) validasi untuk mereka juga akan dinonaktifkan, perhatikan itu!

(Dan jika Anda menggunakan tombol kirim seperti [disabled]="!form.valid"itu akan mengecualikan bidang Anda dari validasi)

masukkan deskripsi gambar di sini

Alex Efimov
sumber
1
Bagaimana Anda bisa memvalidasi bidang yang awalnya dinonaktifkan tetapi ditetapkan secara dinamis?
NeptuneOyster
5

Pendekatan yang lebih umum adalah.

// Variable/Flag declare
public formDisabled = false;

// Form init
this.form = new FormGroup({
  name: new FormControl({value: '', disabled: this.formDisabled}, 
    Validators.required),
 });

// Enable/disable form control
public toggleFormState() {
    this.formDisabled = !this.formDisabled;
    const state = this.formDisabled ? 'disable' : 'enable';

    Object.keys(this.form.controls).forEach((controlName) => {
        this.form.controls[controlName][state](); // disables/enables each form control based on 'this.formDisabled'
    });
}
Herbi Shtini
sumber
3

Jika Anda ingin menonaktifkan first(formcontrol) maka Anda dapat menggunakan pernyataan di bawah ini.

this.form.first.disable();

Gampesh
sumber
3

Ini berhasil untuk saya: this.form.get('first').disable({onlySelf: true});

Foram Jhaveri
sumber
3
this.form.enable()
this.form.disable()

Atau formcontrol 'first'

this.form.get('first').enable()
this.form.get('first').disable()

Anda dapat mengatur menonaktifkan atau mengaktifkan pada set awal.

 first: new FormControl({disabled: true}, Validators.required)
Pu ChengLie
sumber
2

masukkan deskripsi gambar di sini

lastName: new FormControl({value: '', disabled: true}, Validators.compose([Validators.required])),
Abdullah Pariyani
sumber
1

Solusi terbaik ada di sini:

https://netbasal.com/disabling-form-controls-when-working-with-reactive-forms-in-angular-549dd7b42110

Garis besar solusi (dalam kasus tautan rusak):

(1) Buat direktif

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

@Directive({selector: '[disableControl]'})
export class DisableControlDirective {

  @Input() set disableControl( condition : boolean ) {
    const action = condition ? 'disable' : 'enable';
    this.ngControl.control[action]();
  }

  constructor( private ngControl : NgControl ) {}
}

(2) Gunakan seperti itu

<input [formControl]="formControl" [disableControl]="condition">

(3) Karena input yang dinonaktifkan tidak muncul di form.value on submit Anda mungkin perlu menggunakan yang berikut ini (jika diperlukan):

onSubmit(form) {
  const formValue = form.getRawValue() // gets form.value including disabled controls
  console.log(formValue)
}
danday74
sumber
Saya mencoba cara ini. Saya menampilkan sebagian besar FormControls saya setelah menarik data API, jadi setelah menyetel / menambal nilai ke formControl saya menggunakan this.form.get('FIELD_NAME').patchValue(DYNAMIC_VALUE)saya menunjukkan formControl. ketika diteruskan ke direktif, itu menunjukkan Tidak dapat membaca properti 'nonaktifkan' dari undefined
ImFarhad
0

Saya memiliki masalah yang sama, tetapi memanggil this.form.controls ['name']. Disable () tidak memperbaikinya karena saya sedang memuat ulang view saya (menggunakan router.navigate ()).

Dalam kasus saya, saya harus mengatur ulang formulir saya sebelum memuat ulang:

this.form = undefined; this.router.navigate ([path]);

Tai Truong
sumber
0
setTimeout(() => { emailGroup.disable(); });
Judson Terrell
sumber
0

Anda dapat mendeklarasikan fungsi untuk mengaktifkan / menonaktifkan semua kontrol formulir:

  toggleDisableFormControl(value: Boolean, exclude = []) {
    const state = value ? 'disable' : 'enable';
    Object.keys(this.profileForm.controls).forEach((controlName) => {
      if (!exclude.includes(controlName))
        this.profileForm.controls[controlName][state]();
    });
  }

dan gunakan seperti ini

this.toggleDisableFormControl(true, ['email']);
// disbale all field but email
Duong Le
sumber
-2

Untuk membuat lapangan menonaktifkan dan memungkinkan dari reaktif bentuk sudut 2+

1. Untuk menonaktifkan

  • Tambahkan [attr.disabled] = "true" ke masukan.

<input class="form-control" name="Firstname" formControlName="firstname" [attr.disabled]="true">

Untuk mengaktifkan

export class InformationSectionComponent {
formname = this.formbuilder.group({
firstname: ['']
});
}

Aktifkan seluruh formulir

this.formname.enable();

Aktifkan bidang tertentu saja

this.formname.controls.firstname.enable();

sama untuk menonaktifkan, ganti enable () dengan nonaktifkan ().

Ini Bekerja dengan baik. Komentar untuk pertanyaan.

Srinivasan N
sumber