Reaktif formlar - devre dışı bırakılan özellik


109

Ben kullanmaya çalışıyorum disabledbir gelen niteliği formControl. Şablona koyduğumda çalışıyor:

<md-input formControlName="id" placeholder="ID" [disabled]="true"></md-input>

Ancak tarayıcı beni uyarıyor:

Görünüşe göre devre dışı bırakılmış özniteliği reaktif form yönergesi ile kullanıyorsunuz. Bu kontrolü bileşen sınıfınızda kurduğunuzda devre dışı seçeneğini true olarak ayarlarsanız, devre dışı bırakılan özellik aslında sizin için DOM'da ayarlanacaktır. 'Kontrol edildikten sonra değiştirilen' hatalardan kaçınmak için bu yaklaşımı kullanmanızı öneririz.

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

Ben de onu FormControlşablona ekledim ve şablondan sildim:

constructor(private itemsService: ItemsService) {
    this._items = [];
    this.myForm = new FormGroup({
        id: new FormControl({value: '', disabled: true}, Validators.required),
        title: new FormControl(),
        description: new FormControl()
    });
    this.id = this.myForm.controls['id'];
    this.title = this.myForm.controls['title'];
    this.description = this.myForm.controls['description'];
    this.id.patchValue(this._items.length);
}

Ancak çalışmıyor (devre dışı bırakmıyor input). Sorun nedir?


1
Bu, Angular 2'nin şu anki sürümüyle gayet iyi çalışıyor gibi görünüyor: plnkr.co/edit/CQQtkYC9D5EoH0sAlNCV?p=preview
silentsod

Test için en son açısal
CL

2
@ Angular / material'ı kullanıyorsunuz, bu nedenle, github sorunları için: github.com/angular/material2/issues/1171 Henüz desteklenmiyor ve alfa aşamasındalar, bu yüzden özelliğin tamamlanmasını bekleyemezsiniz.
silentsod

Evet, sorun
buydu

6
Yapıcıda bir this.myForm.controls['id'].disable()yere koymayı deneyebilirsiniz . Dinamik formlarla çalışmayı kolaylaştıran bir kütüphane yaptım: github.com/mat3e/dorf
mat3e

Yanıtlar:


124

Kullanıyorum [attr.disabled]çünkü bu şablonu hala daha üstün bir IMO olduğu için programlı etkinleştirme () / devre dışı bırakma () 'dan daha çok seviyorum.

Değişiklik

<md-input formControlName="id" placeholder="ID" [disabled]="true"></md-input>

-e

<md-input formControlName="id" placeholder="ID" [attr.disabled]="true"></md-input>

Eğer yeni malzeme değişikliği vardır md-inputiçin mat-input.


1
Çalışıyor, teşekkürler! Ama neden "attr.disabled" kullanmam gerektiğini anlamıyorum (sadece "devre dışı" değil)?
Sergey Andreev

6
Dikkat etmek gerekirse, [attr.disabled] ile onu iki şekilde bağlamayı kullanamazsınız. Yalnızca bir kez çalışır. İle [disabled]ve konsoldaki uyarı çalışıyor. Angular 4.1.3 kullanıyorum
Bear

2
Sanırım bu [attr.disabled]sadece [disabled]gösterilen uyarıyı tetiklemiyor
K1ngjulien_

4
Neden "üstün" olduğunu düşündüğünüzü açıklayabilir misiniz?
Lazar Ljubenović

1
Form alanının özellikleri HTML şablonundan okunabilir. Verilen bir alanı neyin devre dışı bıraktığına bakmaya karar verdiğiniz güzel bir gün söyleyin, içgüdü diğer yollardan ziyade HTML şablonundan daktilo koduna doğru yürümek.
bhantol

14

Aşağıdaki yöntemleri kullanarak bir form denetimini etkinleştirebilir / devre dışı bırakabilirsiniz:

control.disable () veya control.enable ()

Bu sizin için işe yaramadıysa, bir yönerge kullanabilirsiniz

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

}

O zaman bunu böyle kullanabilirsin

<input [formControl]="formControl" [disableControl]="disable">
<button (click)="disable = true">Disable</button>
<button (click)="disable = false">Enable</button>

Bu teknik burada açıklanmaktadır:

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

Umarım yardımcı olur


lütfen biraz js kod parçacığı gösterebilir misin bunun nasıl yapılacağı
kumaresan_sd

lütfen herhangi bir yığın örneği sağlayın
kumaresan_sd


Bu, Angular 8 ile çalışmaz. VerirNgControl (`No provider for NgControl`)
pantonis

1
Bu çözümün artık Angular 8'den itibaren çalışmadığını doğrulayabilirim !!
Martijn Hiemstra

13

Angular 8 ile benim durumumda . Koşula bağlı olarak girişi etkinleştirmek / devre dışı bırakmak istedim.

[attr.disabled] benim için çalışmadı, bu yüzden işte benim çözümüm.

[attr.disabled]HTML'den kaldırdım ve bileşen işlevinde şu kontrolü gerçekleştirdim:

if (condition) {
    this.form.controls.myField.disable();
} else {
    this.form.controls.myField.enable();
}


4

Kullanarak başlatma (bileşen):

public selector = new FormControl({value: '', disabled: true});

Sonra (şablon) kullanmak yerine:

<ngx-select
[multiple]="true"
[disabled]="errorSelector"
[(ngModel)]="ngxval_selector"
[items]="items"
</ngx-select>

Devre dışı bırakılan özelliği kaldırmanız yeterlidir:

<ngx-select
[multiple]="true"
[(ngModel)]="ngxval_selector"
[items]="items"
</ngx-select>

Ve gösterilecek öğeleriniz olduğunda, başlatın (bileşende): this.selector.enable();


3

Yalnızca reaktif formları kullananlar: Yerel HTML öğeleri için [attr.disabled] çalışacaktır, ancak malzeme öğeleri için öğeyi dinamik olarak devre dışı bırakmamız gerekir.

this.form.get('controlname').disable();

Aksi takdirde konsol uyarı mesajında ​​gösterilecektir.


3

Bunları açısal 7'de denedim. Başarıyla çalıştı.

this.form.controls['fromField'].reset();
if(condition){
      this.form.controls['fromField'].enable();
}
else{
      this.form.controls['fromField'].disable();
}

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

Bir form kontrolü devre dışı bırakır

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

Veya ilk ayar yöntemi.

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

1

[Attr.disabled] yerine [devre dışı] kullanın, benim durumumda iyi çalışıyor


2
Bu mümkün olsa da, reaktif formlarla çalışırken şablon odaklı bir çözüm kullanmamalısınız. Bu ikisinin karıştırılmasıyla ilgili sorun, reaktif form durumuna artık güvenilemeyecek olmasıdır.
enf0rcer

o devre dışı için kullandığı ama yanlış olarak belirledi eğer da devre dışı olsun kontrol
kumaresan_sd

1

html alanına disable = "true" ekleyin Örnek: devre dışı bırak

<amexio-text-input formControlName="LastName" disable="true" [(ngModel)]="emplpoyeeRegistration.lastName" [field-label]="'Last Name'" [place-holder]="'Please enter last name'" [allow-blank]="true" [error-msg]="'errorMsg'" [enable-popover]="true" [min-length]="2"
[min-error-msg]="'Minimum 2 char allowed'" [max-error-msg]="'Maximum 20 char allowed'" name="xyz" [max-length]="20">
[icon-feedback]="true">
</amexio-text-input>


Bu cevap reavtive formda işe yaramayacak. Bu, şablona dayalı formla ilgilidir
Nambi N Rajan

1

Reaktif formların güzelliği, herhangi bir girdi elemanının değer değişikliklerini çok kolay bir şekilde yakalayabilmeniz ve aynı zamanda değerlerini / durumlarını değiştirebilmenizdir. İşte probleminizi kullanarak çözmenin başka bir yolu enable disable.

İşte stackblitz'deki eksiksiz çözüm .


Kodu buraya veya en azından bir parçacığa göndermenizi öneririm. Bu çözümü faydalı buldum, bu nedenle değer değişikliğine abone olmak ve etkinleştir / devre dışı bırakmayı tetiklemek iyi bir seçenek gibi görünüyor.
John White

1

Form doğrulama kullanıyorsanız mat form alanlarının devre dışı bırakılması muaftır, bu nedenle form alanınızda (validators.required) gibi doğrulama olmadığından emin olun, bu benim için çalıştı. örneğin:

editUserPhone: yeni FormControl ({değer: '', devre dışı: true})

bu, kullanıcının telefon numaralarının düzenlenemez olmasını sağlar.


1

Bu benim çözümümdü:

this.myForm = this._formBuilder.group({
    socDate: [[{ value: '', disabled: true }], Validators.required],
    ...
)}

<input fxFlex [matDatepicker]="picker" placeholder="Select Date" formControlName="socDate" [attr.disabled]="true" />

1
Merhaba Frank, StackOverflow'a hoş geldiniz ve cevabınız için teşekkürler! Kodda çalışma çözümü sağlamak kesinlikle harika olsa da, kodun ötesine biraz açıklama eklerseniz, başkalarının şimdi ve gelecekte cevabınızı daha iyi anlamasına yardımcı olabilir.
robsiemb

1

içinde açısal-9 Eğer devre dışı istiyorsanız / burada butonuna tıklayın etkinleştirmek Eğer reaktif formları kullanarak eğer basit bir çözümdür.

component.ts dosyasında bir işlev tanımlayın

//enable example you can use the same approach for disable with .disable()

toggleEnable() {
  this.yourFormName.controls.formFieldName.enable();
  console.log("Clicked")
} 

Component.html'nizden arayın

Örneğin

<button type="button" data-toggle="form-control" class="bg-primary text-white btn- 
                reset" style="width:100%"(click)="toggleEnable()">

0

Yeni Form denetimi oluşturduğunuzda, sonrakini kullanın:

variable: FormControl = new FormControl({value: '', disabled: true});

Aktiviteyi değiştirmek istiyorsanız, sonrakini kullanın:

this.variable.enable() 

veya

this.variable.disable()

-1

md-girişinize isim niteliği ekleyin. sorunu çözmezse lütfen şablonunuzu gönderin


-4

Bunu yapmanın en iyi yolu.

ngOnInit() {
  this.interPretationForm.controls.InterpretationType.valueChanges.takeWhile(()=> this.alive).subscribe(val =>{
    console.log(val); // You check code. it will be executed every time value change.
  })
}
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.