কৌণিক অঞ্চলে এনজিডিফল্টকন্ট্রোল কী?


113

না, এটি কোনও সদৃশ প্রশ্ন নয়। আপনি দেখুন, এসও এবং গিথুবগুলিতে অনেকগুলি প্রশ্ন ও সমস্যা রয়েছে যা নির্ধারণ করে যে আমি এই নির্দেশকে এমন ট্যাগটিতে যুক্ত করছি যা [(ngModel)]নির্দেশ রয়েছে এবং কোনও ফর্মের মধ্যে নেই। আমি এটি যুক্ত না করলে আমি একটি ত্রুটি পেয়েছি:

ERROR Error: No value accessor for form control with unspecified name attribute

ঠিক আছে, আমি এই বৈশিষ্ট্যটি সেখানে রাখলে ত্রুটি চলে যায় away কিন্তু অপেক্ষা করো! কেউ কি জানে না এটি কী করে! এবং অ্যাঙ্গুলারের ডকটি একেবারেই উল্লেখ করে না। আমার যখন এটির প্রয়োজন নেই তখন আমি কেন আমার মূল্য সংযোজকের প্রয়োজন? এই বৈশিষ্ট্যটি কীভাবে মান অ্যাক্সেসরগুলির সাথে সংযুক্ত রয়েছে? এই নির্দেশনাটি কী করে? একটি মূল্য অ্যাক্সেসর কী এবং আমি কীভাবে এটি ব্যবহার করব?

এবং কেন তারা এমন কিছু করে রাখে যা তারা কিছুতেই বুঝতে পারে না? কোডের এই লাইনটি কেবল যুক্ত করুন এবং এটি কাজ করে, আপনাকে ধন্যবাদ, ভাল প্রোগ্রাম লেখার উপায় এটি নয়।

এবং তারপর. আমি কৌণিকের ফর্ম এবং একটি বিভাগ সম্পর্কে দুটি নয় তবে দুটি বিশাল গাইড পড়েছি :ngModel

এবং আপনি জানেন কি? মান অ্যাক্সেসরগুলির একটিরও উল্লেখ নয় ngDefaultControl। এটা কোথায়?


4
> "এবং কেন সবাই এমন কাজ করে যা তারা কিছুতেই বুঝতে পারে না?" - হ্যাঁ! ঠিক! এটি আরও কিছু বিস্ময়বোধক পয়েন্টগুলি ব্যবহার করতে পারে, যদিও ;-)
গাস

উত্তর:


194

[এনজিডিফল্টকন্ট্রোল]

তৃতীয় পক্ষের নিয়ন্ত্রণগুলির ControlValueAccessorকৌণিক ফর্মগুলির সাথে কাজ করতে একটি প্রয়োজন । তাদের মধ্যে অনেকেই পলিমারের <paper-input>মতো <input>দেশীয় উপাদানটির মতো আচরণ করেন এবং এটি ব্যবহার করতে পারেন DefaultValueAccessor। একটি ngDefaultControlবৈশিষ্ট্য যুক্ত করা তাদের সেই নির্দেশনাটি ব্যবহার করার অনুমতি দেবে।

<paper-input ngDefaultControl [(ngModel)]="value>

বা

<paper-input ngDefaultControl formControlName="name">

সুতরাং এই অ্যাট্রিবিউটটি চালু হওয়ার মূল কারণ।

এঙ্গুলার 2 এর আলফা সংস্করণগুলিতেng-default-control এট্রিবিউট বলা হত

ডিফল্টভ্যালুএ্যাকসেসর নির্দেশের ngDefaultControlজন্য নির্বাচকদের মধ্যে একটিও তাই :

@Directive({
  selector:
      'input:not([type=checkbox])[formControlName],
       textarea[formControlName],
       input:not([type=checkbox])[formControl],
       textarea[formControl],
       input:not([type=checkbox])[ngModel],
       textarea[ngModel],
       [ngDefaultControl]', <------------------------------- this selector
  ...
})
export class DefaultValueAccessor implements ControlValueAccessor {

এর মানে কী?

এর অর্থ হল যে আমরা এই বৈশিষ্ট্যটি উপাদানটিতে (পলিমার উপাদানগুলির মতো) প্রয়োগ করতে পারি যার নিজস্ব মান অ্যাক্সেসর নেই। সুতরাং এই উপাদানটি আচরণ গ্রহণ করবে DefaultValueAccessorএবং আমরা এই উপাদানটি কৌনিক ফর্মগুলি সহ ব্যবহার করতে পারি।

অন্যথায় আপনাকে নিজের প্রয়োগ প্রয়োগ করতে হবে ControlValueAccessor

কন্ট্রোলভ্যালুএ্যাকসেসর

কৌণিক ডকস সূচিত করে

একটি কন্ট্রোলভ্যালুএ্যাকসেসর অ্যাঙ্গুলার ফর্ম এপিআই এবং ডিওমে একটি নেটিভ উপাদানগুলির মধ্যে একটি সেতু হিসাবে কাজ করে।

আসুন সাধারণ কৌণিক 2 প্রয়োগে নিম্নলিখিত টেমপ্লেটটি লিখি:

<input type="text" [(ngModel)]="userName">

আমাদের উপরেরগুলি কীভাবে inputআচরণ করবে তা বোঝার জন্য আমাদের এই উপাদানটির সাথে কোন নির্দেশাবলী প্রয়োগ করা হবে তা জানতে হবে। এখানে কৌণিক ত্রুটি সহ কিছু ইঙ্গিত দেয়:

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

ঠিক আছে, আমরা এসও খুলতে পারি এবং উত্তর পেতে পারি: FormsModuleআপনার আমদানি করুন @NgModule:

@NgModule({
  imports: [
    ...,
    FormsModule
  ]
})
export AppModule {}

আমরা এটিকে আমদানি করেছিলাম এবং সমস্ত কাজের উদ্দেশ্যে। তবে হুডের নীচে কী চলছে?

নিম্নোক্ত নির্দেশিকাটি আমাদের জন্য ফর্মমডুল রফতানি করে:

@NgModule({
 ...
  exports: [InternalFormsSharedModule, TEMPLATE_DRIVEN_DIRECTIVES]
})
export class FormsModule {}

এখানে চিত্র বর্ণনা লিখুন

কিছু তদন্তের পরে আমরা আবিষ্কার করতে পারি যে তিনটি নির্দেশাবলী আমাদের প্রয়োগ করা হবে input

1) এনগকন্ট্রোলস্ট্যাটাস

@Directive({
  selector: '[formControlName],[ngModel],[formControl]',
  ...
})
export class NgControlStatus extends AbstractControlStatus {
  ...
}

2) এনজিএমডেল

@Directive({
  selector: '[ngModel]:not([formControlName]):not([formControl])',
  providers: [formControlBinding],
  exportAs: 'ngModel'
})
export class NgModel extends NgControl implements OnChanges, 

3) DEFAULT_VALUE_ACCESSOR

@Directive({
  selector:
      `input:not([type=checkbox])[formControlName],
       textarea[formControlName],
       input:not([type=checkbox])formControl],
       textarea[formControl],
       input:not([type=checkbox])[ngModel],
       textarea[ngModel],[ngDefaultControl]',
  ,,,
})
export class DefaultValueAccessor implements ControlValueAccessor {

NgControlStatusনির্দেশ মাত্র নিপূণভাবে ব্যবহার করেন শ্রেণীর পছন্দ ng-valid, ng-touched, ng-dirtyএবং আমরা তা এখানে বাদ পারবেন না।


DefaultValueAccesstorNG_VALUE_ACCESSORসরবরাহকারী অ্যারেতে টোকেন সরবরাহ করে :

export const DEFAULT_VALUE_ACCESSOR: any = {
  provide: NG_VALUE_ACCESSOR,
  useExisting: forwardRef(() => DefaultValueAccessor),
  multi: true
};
...
@Directive({
  ...
  providers: [DEFAULT_VALUE_ACCESSOR]
})
export class DefaultValueAccessor implements ControlValueAccessor {

NgModelনির্দেশকটি NG_VALUE_ACCESSORএকই হোস্ট উপাদান হিসাবে ঘোষিত কন্সট্রাক্টর টোকনে ইনজেকশন দেয় ।

export NgModel extends NgControl implements OnChanges, OnDestroy {
 constructor(...
  @Optional() @Self() @Inject(NG_VALUE_ACCESSOR) valueAccessors: ControlValueAccessor[]) {

আমাদের ক্ষেত্রে NgModelইনজেকশন হবে DefaultValueAccessor। এবং এখন এনজিএমডেল নির্দেশিত কলগুলি ভাগ করা setUpControlফাংশন:

export function setUpControl(control: FormControl, dir: NgControl): void {
  if (!control) _throwError(dir, 'Cannot find control with');
  if (!dir.valueAccessor) _throwError(dir, 'No value accessor for form control with');

  control.validator = Validators.compose([control.validator !, dir.validator]);
  control.asyncValidator = Validators.composeAsync([control.asyncValidator !, dir.asyncValidator]);
  dir.valueAccessor !.writeValue(control.value);

  setUpViewChangePipeline(control, dir);
  setUpModelChangePipeline(control, dir);

  ...
}

function setUpViewChangePipeline(control: FormControl, dir: NgControl): void 
{
  dir.valueAccessor !.registerOnChange((newValue: any) => {
    control._pendingValue = newValue;
    control._pendingDirty = true;

    if (control.updateOn === 'change') updateControl(control, dir);
  });
}

function setUpModelChangePipeline(control: FormControl, dir: NgControl): void {
  control.registerOnChange((newValue: any, emitModelEvent: boolean) => {
    // control -> view
    dir.valueAccessor !.writeValue(newValue);

    // control -> ngModel
    if (emitModelEvent) dir.viewToModelUpdate(newValue);
  });
}

এবং এখানে কার্যকর সেতু রয়েছে:

এখানে চিত্র বর্ণনা লিখুন

NgModelনিয়ন্ত্রণ সেট (1) এবং কল dir.valueAccessor !.registerOnChangeপদ্ধতি। (2) প্রোপার্টিতে ControlValueAccessorকলব্যাক সঞ্চয় করে এবং ইভেন্টটি ঘটলে এই কলব্যাকটি ফায়ার করে (3) । এবং শেষ পর্যন্ত ফাংশন কল কলব্যাক ভিতরে কল করা হয় (4)onChangeinputupdateControl

function updateControl(control: FormControl, dir: NgControl): void {
  dir.viewToModelUpdate(control._pendingValue);
  if (control._pendingDirty) control.markAsDirty();
  control.setValue(control._pendingValue, {emitModelToViewChange: false});
}

যেখানে কৌনিক কলগুলি এপিআই গঠন করে control.setValue

এটি কীভাবে কাজ করে তার একটি সংক্ষিপ্ত সংস্করণ।


আমি সবেমাত্র তৈরি করেছি @Input() ngModelএবং @Output() ngModelChangeদ্বি নির্দেশমূলক বাঁধাইয়ের জন্য এবং আমি ভেবেছিলাম এটি যথেষ্ট ব্রিজ হওয়া উচিত। এটি সম্পূর্ণ ভিন্ন উপায়ে একই জিনিসটি করার মতো দেখায়। আমার মাঠের নাম রাখা উচিত ngModel?
ঘেরম্যান

4
আপনি যদি কৌণিক ফর্মগুলির সাথে এই উপাদানটি ব্যবহার না করেন তবে আপনি কেবল নিজের দ্বি-মুখী বাঁধাই তৈরি করতে পারেন @Input() value; @Output() valueChange: EventEmitter<any> = new EventEmitter();এবং ঠিক তখন ব্যবহার করতে পারেন[(value)]="someProp"
yurzui

4
আমি ঠিক তাই করছিলাম। তবে আমি আমার "মান" নামকরণ করেছি ngModelএবং কৌণিকর আমার দিকে ত্রুটি ছুঁড়তে শুরু করে এবং কন্ট্রোলওয়ালু অ্যাকসেসরের সাথে জিজ্ঞাসা করতে শুরু করে।
ঘেরম্যান

কেউ কি vg এবং প্রতিক্রিয়াতে ngDefaultControl এর সমতুল্য? আমি বলতে চাইছি, আমি কন্ট্রোল ভ্যালু অ্যাক্সেসর ব্যবহার করে কৌণিকতায় একটি কাস্টম ইনপুট উপাদান তৈরি করেছি এবং এটি কৌণিক উপাদানগুলিতে একটি ওয়েব উপাদান হিসাবে মোড়ানো করি। একই প্রকল্পে আমাকে কৌনিক ফর্মগুলির সাথে কাজ করতে ngDefaultControl ব্যবহার করতে হয়েছিল। তবে ভ্যু অ্যান্ড রিএ্যাক্টে তাদের কাজ করার জন্য আমার কী করা উচিত? নেটিভ জেএসেও?
কবিতা জয়কোডি

আমি আমার কাস্টম উপাদানটিতে এনজিডিফল্টকন্ট্রোল ব্যবহার করছি তবে আমি একটি সমস্যার সাথে লড়াই করছি। আমি যখন আমার ফর্ম বিল্ডার ভিউতে (কাস্টম ইনপুট উপাদান) ফর্মকন্ট্রোলের জন্য ডিফল্ট মান সেট করি তবে কেবলমাত্র মডেল। আমি কি ভুল করছি?
ইগোর জাঙ্কোভিć
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.