প্রতিক্রিয়াশীল ফর্ম - বৈশিষ্ট্য অক্ষম


109

আমি disabledএকটি থেকে গুণটি ব্যবহার করার চেষ্টা করছি formControl। আমি যখন এটি টেমপ্লেটে রাখি তখন এটি কাজ করে:

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

তবে ব্রাউজারটি আমাকে সতর্ক করে:

দেখে মনে হচ্ছে আপনি একটি প্রতিক্রিয়াশীল ফর্ম নির্দেশের সাথে অক্ষম বৈশিষ্ট্যটি ব্যবহার করছেন। আপনি যখন আপনার উপাদান শ্রেণিতে এই নিয়ন্ত্রণটি সেট আপ করেন আপনি যদি সত্যকে অক্ষম সেট করে থাকেন তবে অক্ষম বৈশিষ্ট্যটি আসলে আপনার জন্য ডিওমে সেট করা হবে। 'পরীক্ষার পরে পরিবর্তিত' ত্রুটিগুলি এড়ানোর জন্য আমরা এই পদ্ধতির ব্যবহারের পরামর্শ দিই।

  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)। সমস্যাটা কি?


4
এটি Angular 2 এর বর্তমান সংস্করণটির সাথে ঠিক কাজ করছে বলে মনে হচ্ছে: plnkr.co/edit/CQQtkYC9D5EoH0sAlNCV?p= পূর্বরূপ
সিলেন্টসড

আমি পরীক্ষার জন্য
সর্বশেষতম

4
আপনি @ কৌণিক / উপাদান ব্যবহার করছেন, সুতরাং, তাদের গিথুব ইস্যু অনুসারে: github.com/angular/matory2/issues/1171 এটি এখনও সমর্থিত নয় এবং তারা আলফাতে রয়েছে যাতে আপনি এটি বৈশিষ্ট্য সম্পূর্ণ হওয়ার প্রত্যাশা করতে পারবেন না।
সিলেন্টসড

হ্যাঁ, এটি সমস্যা ছিল
FacundoGFlores

6
আপনি this.myForm.controls['id'].disable()কনস্ট্রাক্টর কোথাও রাখার চেষ্টা করতে পারেন । আমি একটি লাইব্রেরি করেছি যা গতিশীল ফর্মগুলির সাথে কাজ করা সহজ করে তোলে: github.com/mat3e/dorf
mat3e

উত্তর:


125

আমি ব্যবহার করছি [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


4
এটি কাজ করে, ধন্যবাদ! তবে আমি বুঝতে পারি না কেন আমাকে "অ্যাটারডিজবল" (কেবল "অক্ষম" নয়) ব্যবহার করা উচিত?
সের্গেয় আন্দ্রেভ

6
কেবলমাত্র লক্ষণীয়, [অ্যাটর্সিডবলড] এর মাধ্যমে আপনি এটিকে দুটি উপায়ে বাঁধাই করতে পারবেন না। এটি শুধুমাত্র একবারে কাজ করে। [disabled]কনসোল সহ সতর্কতা কাজ করছে। আমি
কৌনিক

4
আমি মনে করি যে [attr.disabled]শুধু সতর্কবার্তা আরম্ভ নয় যে [disabled]শো
K1ngjulien_

4
আপনি কেন এটি "উচ্চতর" বলে বিশদটি ব্যাখ্যা করতে পারেন?
লাজার লুবুবেনভিov

4
ফর্ম ক্ষেত্রের বৈশিষ্ট্যগুলি HTML টেমপ্লেট থেকে পঠনযোগ্য। একটি সূক্ষ্ম দিন বলুন আপনি কোনও নির্দিষ্ট ক্ষেত্রটি কীভাবে অক্ষম করে তা দেখার সিদ্ধান্ত নিয়েছেন যে প্রবণতাটি এইচটিএমএল টেমপ্লেট থেকে অন্যান্য উপায়ে তুলনায় টাইপ স্ক্রিপ্ট কোডের দিকে চলতে পারে।
ভ্যানটল

14

আপনি নিম্নলিখিত পদ্ধতিগুলি ব্যবহার করে একটি ফর্ম নিয়ন্ত্রণ সক্ষম / অক্ষম করতে পারেন:

কন্ট্রোল.ডিজিয়েবল () অথবা কন্ট্রোল.এনেবল ()

যদি এটি কাজ না করে তবে আপনি একটি নির্দেশিকা ব্যবহার করতে পারেন

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

আশা করি এটা সাহায্য করবে


কীভাবে আপনি এটি করতে পারেন দয়া করে কিছু
জেএস

দয়া করে কোনও স্ট্যাকব নমুনা সরবরাহ করুন
কুমারসান_এসডি

এখানে উদাহরণস্বরূপ: নেটবাসাল.com/…
জানাতবেক শার্শেভ

এটি NgControl (`No provider for NgControl`)
কৌনিক

4
আমি নিশ্চিত করতে পারি যে এই সমাধানটি কৌনিক 8 এর মতো আর কাজ করে না!
মার্টিজন হিমনস্ট্রা

13

আমার ক্ষেত্রে কৌনিক 8 । আমি শর্তের উপর নির্ভর করে ইনপুটটি সক্ষম / অক্ষম টগল করতে চেয়েছিলাম।

[attr.disabled] আমার পক্ষে কাজ করেনি তাই এখানে আমার সমাধান।

আমি [attr.disabled]এইচটিএমএল থেকে অপসারণ করেছি এবং উপাদান পরীক্ষা করে এই চেকটি সম্পাদন করেছি:

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

12

আমি দেখতে পেয়েছি যে এটির কাজ করার জন্য খালি স্ট্রিং হলেও আমার ডিফল্ট মান থাকা দরকার। সুতরাং এই:

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

... এটি হয়ে উঠতে হয়েছিল:

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

আমার প্রশ্নটি দেখুন (যা আমি বিশ্বাস করি না যে এটি সদৃশ): ফর্মকন্ট্রোল কনস্ট্রাক্টরের কাছে ফর্ম স্টেট অবজেক্টে 'অক্ষম' পাস করা কাজ করে না


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


3

কেবলমাত্র যারা প্রতিক্রিয়াশীল ফর্মগুলি ব্যবহার করছেন: নেটিভ এইচটিএমএল উপাদানগুলির জন্য [অ্যাট্রিজেড] সক্ষম হবে তবে উপাদান উপাদানগুলির জন্য আমাদের উপাদানটিকে গতিশীলভাবে অক্ষম করতে হবে।

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

অন্যথায় এটি কনসোল সতর্কতা বার্তায় প্রদর্শিত হবে।


3

আমি কৌণিক 7 এ এগুলি চেষ্টা করেছি It এটি সফলভাবে কাজ করেছে।

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

একটি ফর্মকন্ট্রোল অক্ষম করে তোলে

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

বা প্রাথমিক সেট পদ্ধতি।

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

1

পরিবর্তে [অক্ষম] ব্যবহার করুন [অক্ষম], আমার ক্ষেত্রে এটি ঠিক আছে


4
যদিও এটি সম্ভব হতে পারে, প্রতিক্রিয়াশীল ফর্মগুলির সাথে কাজ করার সময় আপনার কোনও টেম্পলেট চালিত সমাধান ব্যবহার করা উচিত নয়। এই দুটি মিশ্রিত করতে সমস্যা হ'ল প্রতিক্রিয়াশীল ফর্মের রাজ্যের উপর আর বিশ্বাস করা যায় না।
enf0rcer

এটি অক্ষম করতে ব্যবহার করে তবে আমি যদি এটি মিথ্যা হিসাবে সেট করি তবে নিয়ন্ত্রণও অক্ষম হয়ে যায়
কুমারসান_এসডি

1

এইচটিএমএল ক্ষেত্রে অক্ষম = "সত্য" যুক্ত করুন উদাহরণ: অক্ষম করুন

<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/…
কুমারসান_এসডি

এই উত্তরটি প্রতিক্রিয়াশীল ফর্মে কাজ করবে না thএটি টেম্পলেট চালিত ফর্মের সাথে সম্পর্কিত
নাম্বি এন রাজন

1

প্রতিক্রিয়াশীল ফর্মগুলির সৌন্দর্য হ'ল আপনি খুব সহজেই কোনও ইনপুট উপাদানগুলির ইভেন্টের মান পরিবর্তন করতে পারেন এবং একই সাথে আপনি তাদের মান / স্থিতি পরিবর্তন করতে পারেন। সুতরাং এখানে ব্যবহার করে আপনার সমস্যা মোকাবেলার আরেকটি উপায়enable disable

স্ট্যাকব্লিটজ-এর সম্পূর্ণ সমাধান এখানে ।


আমি আপনাকে এখানে কোড পোস্ট করার পরামর্শ দিচ্ছি বা কমপক্ষে একটি স্নিপেট। আমি এই সমাধানটি দরকারী হিসাবে পেয়েছি, সুতরাং মান পরিবর্তন এবং সাবস্ক্রাইব সক্ষম / অক্ষম ট্রিগার সাবস্ক্রাইব একটি ভাল বিকল্প বলে মনে হচ্ছে।
জন হোয়াইট

1

আপনি যদি ফর্ম বৈধতা ব্যবহার করে থাকেন তবে মাদুর ফর্ম ক্ষেত্রগুলি অক্ষম করা অব্যাহতিপ্রাপ্ত so প্রাক্তন জন্য:

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

4
হাই ফ্র্যাঙ্ক, স্ট্যাকওভারফ্লোতে আপনাকে স্বাগতম, এবং আপনার উত্তরের জন্য ধন্যবাদ! যদিও কোডটিতে একটি কার্যকরী সলিউশন সরবরাহ করা অবশ্যই দুর্দান্ত, আপনি কোডের বাইরে কিছুটা ব্যাখ্যা যোগ করলে এটি অন্যকে এখন এবং ভবিষ্যতে আরও ভালভাবে বুঝতে সাহায্য করতে পারে।
robsiemb

1

মধ্যে কৌণিক -9 যদি আপনি অক্ষম করতে চান / বাটনে ক্লিক করে সক্ষম করুন এখানে একটি সহজ সমাধান আপনি প্রতিক্রিয়াশীল ফর্ম ব্যবহার করছেন।

घटक.ts ফাইলে একটি ফাংশন সংজ্ঞায়িত করুন

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

আপনার এমডি-ইনপুটটিতে নাম বৈশিষ্ট্য যুক্ত করুন। যদি এটি সমস্যার সমাধান না করে তবে আপনার টেম্পলেটটি পোস্ট করুন


-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.
  })
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.