Reaktif formda Giriş alanlarını devre dışı bırakın


118

Zaten buradan başka cevapların örneğini izlemeye çalıştım ve başarılı olamadım!

Reaktif bir form (yani dinamik) oluşturdum ve bazı alanları herhangi bir zamanda devre dışı bırakmak istiyorum. Form kodum:

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

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

Kolaylaştırmak için kodu düşürdüm. Select type alanını devre dışı bırakmak istiyorum. Aşağıdakileri yapmaya çalıştım:

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

çalışmıyor! Bir önerisi olan var mı?


Denilen bazı form kontrollerini devre dışı bırakmaya çalışırken, seçme nasıl devre dışı bırakılabilir first? `:)
AJT82

Sadece yazım hatasıydı. Seçimi devre dışı bırakmak istiyorum. Bana yardım eder misiniz?
Renato Souza de Oliveira

Bir plunker üretebilir misin?
AJT82

Tüm seçimi devre dışı bırakmaya mı çalışıyorsunuz? Ve valuebir formArray değil, bir formControlName. İsterseniz valuebir formArray olmak bunu değiştirmek zorunda kalacak. Şu anda bir formControlName'dir. Bu nedenle, tüm seçim alanının devre dışı bırakılmasını istiyorsanız, şu şekilde değiştirin <select formArrayName="value">:<select formControlName="value">
AJT82

Yanıtlar:


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

veya

this.form.controls['name'].disable();

şöyle bir değer ayarlarsam -> ülke: [{değer: this.address.country, devre dışı bırakıldı: doğru}] değer doldurmaz
Silvio Troia

Güvenilir kaynaklardan otomatik olarak doldurulan alanları devre dışı bırakmak için aynı tekniği kullandım. Formu etkinleştirmek / devre dışı bırakmak için bir anahtarım var ve tüm formu etkinleştirdikten sonra, genellikle bu alanları ififadeler kullanarak devre dışı bırakıyorum. Form gönderildikten sonra tüm form bir kez daha devre dışı bırakılır.
retr0

72

Çok dikkat

Koşul için değişken kullanarak bir form oluşturuyorsanız ve daha sonra değiştirmeye çalışıyorsanız, çalışmaz, yani form değişmez .

Örneğin

this.isDisabled = true;

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

ve değişkeni değiştirirseniz

this.isDisabled = false;

form değişmeyecek. Kullanmalısın

this.cardForm.get ('sayı']. disable ();

BTW.

Değeri değiştirmek için patchValue yöntemini kullanmalısınız:

this.cardForm.patchValue({
    'number': '1703'
});

22

Devre dışı bırakmayı reaktif formlar içeren bir DOM'da kullanmak kötü bir uygulamadır. Bu seçeneği FormControlşuradan başlattığınızda

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

Mülkiyet valuegerekli değil

Veya form kontrolünüzü alabilir get('control_name')ve ayarlayabilirsinizdisable

this.userForm.get('username').disable();

Etkin formlarla DOM içinde devre dışı bırakmak neden kötü bir uygulamadır?
pumpthehead

2
Açısaldan bir uyarı alacaksınız. 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. Bu nedenle, devre dışı bırakma / etkinleştirme durumunu doğrudan kontroller aracılığıyla değiştirmenin önerilen yolu. Ayrıca, bu harika konuya netbasal.com/… bakabilirsiniz
Volodymyr Khmil

10

Girdi nesnemi etiketiyle birlikte bir alan kümesine sararak çözdüm: Alan kümesinde devre dışı bırakılmış özelliğin boole değerine bağlanması gerekir

 <fieldset [disabled]="isAnonymous">
    <label class="control-label" for="firstName">FirstName</label>
    <input class="form-control" id="firstName" type="text" formControlName="firstName" />
 </fieldset>

1
reaktif formlarda kontrollerin nasıl devre dışı bırakılacağını bulmak için çok zaman harcadı, LOL! bu işe yaradı .. hiçbir direktif veya ekstra kod gerekmez. şerefe 🍻
Nexus

7

disablingFormControl preventsbu ise bir formda mevcut olduğu saving. Sadece readonlyözelliği ayarlayabilirsiniz .

Ve bunu şu şekilde başarabilirsiniz:

HTML:

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

TS:

this.disbaleSelect = true;

Bunu burada buldum


2
form.getRawValue()Devre dışı bırakılan kontrol değerlerini eklemek için kullanabilirsiniz
Murhaf Sousli

6

Kullanımı ise disabled(doğru cevap önerilen gibi form giriş elemanları nasıl devre dışı girişine onları da özürlü olması için dikkat alacak için doğrulama)!

(Ve eğer gönder düğmesini kullanıyorsanız, [disabled]="!form.valid"alanınızı doğrulamanın dışında tutacaktır)

görüntü açıklamasını buraya girin


1
Başlangıçta devre dışı bırakılan ancak dinamik olarak ayarlanan alanları nasıl doğrulayabilirsiniz?
NeptuneOyster

5

Daha genel bir yaklaşım olacaktır.

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

firstDevre dışı bırakmak istiyorsanız (formcontrol), aşağıdaki ifadeyi kullanabilirsiniz.

this.form.first.disable();


3

Bu benim için çalıştı: this.form.get('first').disable({onlySelf: true});


3
this.form.enable()
this.form.disable()

Veya formcontrol 'ilk'

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

İlk sette devre dışı bırakabilir veya etkinleştirebilirsiniz.

 first: new FormControl({disabled: true}, Validators.required)

2

görüntü açıklamasını buraya girin

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

1

En iyi çözüm burada:

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

Çözüm özeti (kopuk bağlantı durumunda):

(1) Bir yönerge oluşturun

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) Öyle kullanın

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

(3) Devre dışı girişler form.value'da gönderilmediği için bunun yerine aşağıdakileri kullanmanız gerekebilir (gerekirse):

onSubmit(form) {
  const formValue = form.getRawValue() // gets form.value including disabled controls
  console.log(formValue)
}

Bu yolu denedim. FormControllerimin çoğunu API verilerini aldıktan sonra gösteriyorum, bu yüzden formControl'üme değer ayarladıktan / yama uyguladıktan this.form.get('FIELD_NAME').patchValue(DYNAMIC_VALUE)sonra formControl'ü gösteriyorum. o yönergesine geçirilen zaman, gösterileri tanımlanmamış bir özelliği okunamıyor 'devre dışı'
ImFarhad

0

Aynı sorunu yaşadım, ancak this.form.controls ['name'] 'i çağırmak sorunu çözmedi, çünkü görünümümü yeniden yüklüyordum (router.navigate () kullanarak).

Benim durumumda, yeniden yüklemeden önce formumu sıfırlamam gerekiyordu:

this.form = tanımsız; this.router.navigate ([yol]);



0

Tüm form denetimini etkinleştirmek / devre dışı bırakmak için bir işlev bildirebilirsiniz:

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

ve böyle kullan

this.toggleDisableFormControl(true, ['email']);
// disbale all field but email

-2

Bir alanı devre dışı bırakmak ve reaktif formu açısal etkinleştirmek için 2+

1. Devre dışı bırakmak için

  • Girişe [attr.disabled] = "true" ekleyin .

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

Etkinleştirmek

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

Tüm formu etkinleştir

this.formname.enable();

Belirli bir alanı tek başına etkinleştir

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

devre dışı bırakmak için de aynı, enable () yerine disable () yazın.

Bu iyi çalışıyor. Sorgular için yorum yapın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.