प्रतिक्रियाशील रूप - विकलांग विशेषता


97

मैं disabledएक से विशेषता का उपयोग करने की कोशिश कर रहा हूँ formControl। जब मैंने इसे खाके में रखा, तो यह काम करता है:

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

लेकिन ब्राउज़र मुझे सचेत करता है:

ऐसा लगता है कि आप प्रतिक्रियाशील फ़ॉर्म निर्देश के साथ अक्षम विशेषता का उपयोग कर रहे हैं। यदि आप अपने घटक वर्ग में इस नियंत्रण को सेट करते समय सही पर अक्षम हो जाते हैं, तो अक्षम विशेषता वास्तव में आपके लिए DOM में सेट हो जाएगी। हम जाँच किए गए त्रुटियों के बाद 'परिवर्तित' से बचने के लिए इस दृष्टिकोण का उपयोग करने की सलाह देते हैं।

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

इसलिए मैंने इसे डाल दिया FormControl, और टेम्पलेट से हटा दिया गया:

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

लेकिन यह काम नहीं करता है (यह अक्षम नहीं है input)। समस्या क्या है?


1
यह कोणीय 2 के वर्तमान संस्करण के साथ ठीक काम करता प्रतीत होता है: plnkr.co/edit/CQQtkYC9D5EoH0sAlNCV?p=preview
silentsod

मैं परीक्षण के लिए सबसे
आखिरी

2
आप @ कोणीय / सामग्री का उपयोग कर रहे हैं, इसलिए, उनके github मुद्दों के अनुसार: github.com/angular/material2/issues/1171 यह अभी तक समर्थित नहीं है और वे अल्फा में हैं, इसलिए आप इसे पूर्ण होने की उम्मीद नहीं कर सकते।
साइलेंटोड

हां, यह समस्या थी
19und में फेसुंडोफ्लोरेस

6
आप this.myForm.controls['id'].disable()कंस्ट्रक्टर में कहीं भी डालने की कोशिश कर सकते हैं । मैंने एक पुस्तकालय किया जो गतिशील रूपों के साथ काम करना आसान बनाता है: github.com/mat3e/dorf
Mat3e

जवाबों:


116

मैं उपयोग [attr.disabled]कर रहा हूं क्योंकि मुझे अभी भी यह टेम्पलेट प्रोग्रामेटिक सक्षम () / अक्षम () से बेहतर है क्योंकि यह बेहतर आईएमओ है।

परिवर्तन

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

सेवा

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

यदि आप नए सामग्री परिवर्तन md-inputपर हैं mat-input


1
यह काम करता है, धन्यवाद! लेकिन मुझे समझ नहीं आ रहा है कि मुझे "attr.disabled" (न केवल "अक्षम") का उपयोग क्यों करना चाहिए?
सर्गेई एंड्रीव

6
बस ध्यान दें, [attr.disabled] के साथ आप इसे दो तरह से बाँध नहीं सकते। यह केवल एक बार काम करता है। के साथ [disabled]और कंसोल में चेतावनी काम कर रही है। मैं Angular 4.1.3
The.Bear

2
मुझे लगता है कि [attr.disabled]सिर्फ चेतावनी को [disabled]प्रदर्शित नहीं करता है
K1ngjulien_

3
क्या आप इस बारे में विस्तार से बता सकते हैं कि आप इसे "श्रेष्ठ" क्यों मानते हैं?
लज़ार लुजुबेनोविक

1
प्रपत्र फ़ील्ड के गुण HTML टेम्पलेट से पठनीय हैं। एक दिन कहें कि आप यह देखने का निर्णय लेते हैं कि किसी दिए गए क्षेत्र को किस प्रकार से अक्षम किया जाता है, वृत्ति HTML टेम्पलेट से अन्य तरीकों की तुलना में टाइपस्क्रिप्ट कोड की ओर चलना है।
bantol

13

आप निम्न विधियों का उपयोग करके प्रपत्र नियंत्रण को सक्षम / अक्षम कर सकते हैं:

control.disable () या control.enable ()

यदि वह आपके लिए काम नहीं करता है तो आप एक निर्देश का उपयोग कर सकते हैं

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

}

तब आप इसे इस तरह इस्तेमाल कर सकते थे

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

यह तकनीक यहाँ वर्णित है:

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

आशा करता हूँ की ये काम करेगा


क्या आप कृपया कुछ js कोड स्निपेट दिखा सकते हैं कि यह कैसे करना है
kumaresan_sd

कृपया कोई भी स्टैम्प नमूने प्रदान करें
कुमारसेन_एसडी

यहाँ उदाहरण है: netbasal.com/…
Janatbek Sharsheyev

यह कोणीय 8 के साथ काम नहीं करता है। यह देता हैNgControl (`No provider for NgControl`)
पैनटोनिस

1
मैं इस बात की पुष्टि कर सकता हूँ कि यह समाधान अब कोणीय solution की तरह काम नहीं करता है !!
मार्टिन Hiemstra

10

मैंने पाया कि मुझे एक डिफ़ॉल्ट मान की आवश्यकता थी, भले ही वह काम करने के लिए एक खाली स्ट्रिंग था। तो यह:

this.registerForm('someName', {
  firstName: new FormControl({disabled: true}),
});

... यह बनना था:

this.registerForm('someName', {
  firstName: new FormControl({value: '', disabled: true}),
});

मेरा प्रश्न देखें (जो मुझे विश्वास नहीं है कि एक डुप्लिकेट है): फॉर्म स्टेट कंटेंट के लिए फॉर्म स्टेट ऑब्जेक्ट में 'अक्षम' पास करना काम नहीं करता है


9

मेरे मामले में कोणीय 8 के साथ । मैं शर्त के आधार पर इनपुट को सक्षम / अक्षम करना चाहता था।

[attr.disabled] यहाँ मेरे लिए काम नहीं किया इसलिए मेरा समाधान है।

मैंने [attr.disabled]HTML से निकाल दिया और घटक फ़ंक्शन ने यह जाँच की:

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

4

उपयोग के लिए प्रारंभिक (घटक):

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

तब उपयोग करने के बजाय (टेम्पलेट):

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

अक्षम विशेषता को हटा दें:

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

और जब आपके पास दिखाने के लिए आइटम हों, लॉन्च करें (घटक में): this.selector.enable();


2

केवल वे जो प्रतिक्रियाशील रूपों का उपयोग कर रहे हैं: देशी HTML तत्वों के लिए [attr.disabled] काम करेगा लेकिन भौतिक तत्वों के लिए हमें तत्व को गतिशील रूप से अक्षम करना होगा।

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

अन्यथा यह कंसोल चेतावनी संदेश में दिखाई देगा।


2

मैंने इन्हें कोणीय 7 में आज़माया। इसने सफलतापूर्वक काम किया।

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

2
this.form.disable()
this.form.enable()

एक के लिए formcontrol अक्षम बनाता है

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

या प्रारंभिक सेट विधि।

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

1

[Attr.disabled] के बजाय [अक्षम] का उपयोग करें, मेरे मामले में यह ठीक काम करता है


2
जबकि यह संभव हो सकता है, आपको प्रतिक्रियाशील रूपों के साथ काम करते समय टेम्पलेट संचालित समाधान का उपयोग नहीं करना चाहिए। उन दोनों को मिलाने में समस्या यह है कि प्रतिक्रियाशील रूप स्थिति पर अब भरोसा नहीं किया जा सकता है।
enf0rcer

यह अक्षम करने के लिए उपयोग करता है, लेकिन अगर मैं इसे भी गलत के रूप में सेट करता हूं तो नियंत्रण अक्षम हो जाता है
कुमारसेन_एसडी

1

html फ़ील्ड में अक्षम करें = "सही" उदाहरण जोड़ें: अक्षम करें

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

काम नहीं कर रहा । नमूना लिंक - stackblitz.com/edit/angular-zdpavf?file=src/app/…
कुमारनीसन_sd

यह उत्तर अभिकर्मक रूप में काम नहीं करेगा। यह टेम्प्लेट संचालित फॉर्म से संबंधित है
नांबी एन राजन

1

प्रतिक्रियाशील रूपों की सुंदरता यह है कि आप किसी भी इनपुट तत्व के मूल्यों में परिवर्तन को बहुत आसानी से पकड़ सकते हैं और साथ ही साथ आप उनके मूल्यों / स्थिति को बदल सकते हैं। तो यहाँ एक और तरीका है अपनी समस्या से निपटने का enable disable

यहाँ स्टैकब्लिट्ज़ पर पूरा समाधान है ।


मेरा सुझाव है कि आप यहां भी कोड पोस्ट करें, या कम से कम एक स्निपेट। मुझे यह समाधान उपयोगी लगा, इसलिए मूल्य परिवर्तन और ट्रिगरिंग सक्षम / अक्षम करना एक अच्छा विकल्प लगता है।
जॉन व्हाइट

1

यदि आप प्रपत्र सत्यापन का उपयोग कर रहे हैं, तो मैट फ़ॉर्म फ़ील्ड को अक्षम करने की छूट दी गई है, इसलिए सुनिश्चित करें कि आपके फॉर्म फ़ील्ड में कोई सत्यापन नहीं है जैसे (validators.required), यह मेरे लिए काम करता है। पूर्व के लिए:

editUserPhone: नया फ़ॉर्मकंट्रोल ({मान: '', अक्षम: सत्य})

यह उपयोगकर्ता के फ़ोन नंबर को गैर-संपादन योग्य बनाता है।


1

यह मेरा समाधान था:

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

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

1
हाय फ्रैंक, StackOverflow में आपका स्वागत है, और आपके उत्तर के लिए धन्यवाद! हालांकि यह निश्चित रूप से कोड में एक काम करने वाला सॉल्यूशन प्रदान करने के लिए बहुत अच्छा है, यह अब दूसरों की मदद कर सकता है और भविष्य में आपके उत्तर को बेहतर ढंग से समझ सकता है यदि आप कोड से परे थोड़ा स्पष्टीकरण जोड़ते हैं।
robsiemb

1

में कोणीय-9 यदि आप को निष्क्रिय करना चाहते / बटन पर क्लिक करें सक्षम यहाँ एक सरल उपाय है अगर आप प्रतिक्रियाशील रूपों का उपयोग कर रहे हैं।

घटक में एक फ़ंक्शन परिभाषित करें। फ़ाइल

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

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

इसे अपने कंपोनेंट से कॉल करें। html

जैसे

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

0

जब आप नया फ़ॉर्म नियंत्रण बनाते हैं, तो अगला उपयोग करें:

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

यदि आप गतिविधि बदलना चाहते हैं, तो अगला उपयोग करें:

this.variable.enable() 

या

this.variable.disable()

-1

अपने md-input में नाम विशेषता जोड़ें। यदि यह समस्या का समाधान नहीं करता है, तो कृपया अपना खाका पोस्ट करें


-4

ऐसा करने का अंतिम तरीका।

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.
  })
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.