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?


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

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

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

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>

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


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


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

3

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

this.form.first.disable();



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)

2

masukkan deskripsi gambar di sini

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

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

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



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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.