কৌণিক 2 কাস্টম ফর্ম ইনপুট


94

আমি কীভাবে কাস্টম উপাদান তৈরি করতে পারি যা <input>দেশী ট্যাগের মতো কাজ করবে ? আমি আমার কাস্টম ফর্ম নিয়ন্ত্রণটিকে এনজিকন্ট্রোল, এনজিফর্ম, [(এনজিএমডেল)] সমর্থন করতে সক্ষম করতে চাই।

আমি যেমন বুঝতে পেরেছি, আমার নিজের ফর্ম নিয়ন্ত্রণের কাজটি দেশীয়ের মতো করার জন্য আমাকে কিছু ইন্টারফেস প্রয়োগ করতে হবে।

এছাড়াও, মনে হয় এনজিএফর্মের নির্দেশিকা কেবল <input>ট্যাগের জন্য বাঁধাই , এটি কি ঠিক? আমি কীভাবে এটি মোকাবেলা করতে পারি?


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

PS: আমি টাইপস্ক্রিপ্ট ব্যবহার করি।


4
সর্বাধিক উত্তরগুলি বর্তমান কৌনিক সংস্করণ সম্পর্কিত পুরানো। কটাক্ষপাত আছে stackoverflow.com/a/41353306/2176962
hgoebl

উত্তর:


86

আসলে বাস্তবায়নের জন্য দুটি জিনিস রয়েছে:

  • এমন একটি উপাদান যা আপনার ফর্মের উপাদানটির যুক্তি সরবরাহ করে। এটি কোনও ইনপুট লাগবে না কারণ এটি ngModelনিজেই সরবরাহ করা হবে
  • একটি কাস্টম ControlValueAccessorযা এই উপাদান এবং ngModel/ এর মধ্যে ব্রিজটি কার্যকর করবেngControl

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

(...)
import {TagsComponent} from './app.tags.ngform';
import {TagsValueAccessor} from './app.tags.ngform.accessor';

function notEmpty(control) {
  if(control.value == null || control.value.length===0) {
    return {
      notEmpty: true
    }
  }

  return null;
}

@Component({
  selector: 'company-details',
  directives: [ FormFieldComponent, TagsComponent, TagsValueAccessor ],
  template: `
    <form [ngFormModel]="companyForm">
      Name: <input [(ngModel)]="company.name"
         [ngFormControl]="companyForm.controls.name"/>
      Tags: <tags [(ngModel)]="company.tags" 
         [ngFormControl]="companyForm.controls.tags"></tags>
    </form>
  `
})
export class DetailsComponent implements OnInit {
  constructor(_builder:FormBuilder) {
    this.company = new Company('companyid',
            'some name', [ 'tag1', 'tag2' ]);
    this.companyForm = _builder.group({
       name: ['', Validators.required],
       tags: ['', notEmpty]
    });
  }
}

TagsComponentকম্পোনেন্ট যোগ করতে পারেন এবং উপাদান মুছে ফেলার জন্য যুক্তিবিজ্ঞান সংজ্ঞায়িত tagsতালিকা।

@Component({
  selector: 'tags',
  template: `
    <div *ngIf="tags">
      <span *ngFor="#tag of tags" style="font-size:14px"
         class="label label-default" (click)="removeTag(tag)">
        {{label}} <span class="glyphicon glyphicon-remove"
                        aria-  hidden="true"></span>
      </span>
      <span>&nbsp;|&nbsp;</span>
      <span style="display:inline-block;">
        <input [(ngModel)]="tagToAdd"
           style="width: 50px; font-size: 14px;" class="custom"/>
        <em class="glyphicon glyphicon-ok" aria-hidden="true" 
            (click)="addTag(tagToAdd)"></em>
      </span>
    </div>
  `
})
export class TagsComponent {
  @Output()
  tagsChange: EventEmitter;

  constructor() {
    this.tagsChange = new EventEmitter();
  }

  setValue(value) {
    this.tags = value;
  }

  removeLabel(tag:string) {
    var index = this.tags.indexOf(tag, 0);
    if (index != undefined) {
      this.tags.splice(index, 1);
      this.tagsChange.emit(this.tags);
    }
  }

  addLabel(label:string) {
    this.tags.push(this.tagToAdd);
    this.tagsChange.emit(this.tags);
    this.tagToAdd = '';
  }
}

আপনি দেখতে পাচ্ছেন যে এই উপাদানটিতে কোনও ইনপুট নেই তবে একটি setValue(নামটি এখানে গুরুত্বপূর্ণ নয়)। ngModelউপাদানটি থেকে উপাদানটিকে মান সরবরাহ করতে আমরা এটি পরে ব্যবহার করি । উপাদানটির স্থিতি (ট্যাগ তালিকা) আপডেট করা হলে এই উপাদানটি একটি ইভেন্টকে অবহিত করার জন্য সংজ্ঞা দেয়।

আসুন এখন এই উপাদান এবং ngModel/ এর মধ্যে লিঙ্কটি বাস্তবায়ন করি ngControl। এটি ControlValueAccessorইন্টারফেস প্রয়োগ করে এমন একটি নির্দেশের সাথে মিলে যায় । NG_VALUE_ACCESSORটোকেনের বিপরীতে এই মান অ্যাক্সেসরের জন্য কোনও সরবরাহকারীকে অবশ্যই সংজ্ঞায়িত করতে হবে ( forwardRefনির্দেশটি পরে সংজ্ঞায়িত করার পরে ব্যবহার করতে ভুলবেন না )।

দিকনির্দেশকটি tagsChangeহোস্টের ইভেন্টে ইভেন্ট শ্রোতাদের সংযুক্ত করবে (যেমন নির্দেশকের সাথে সংযুক্ত উপাদান, অর্থাৎ TagsComponent)। onChangeযখন ইভেন্ট ঘটে পদ্ধতি ডাকা হবে। এই পদ্ধতিটি Angular2 দ্বারা নিবন্ধিত একটির সাথে মিলে যায়। এইভাবে এটি সম্পর্কিত ফর্ম নিয়ন্ত্রণ অনুসারে পরিবর্তন এবং আপডেট সম্পর্কে সচেতন হবে।

writeValueযখন বাউন্ড মান বলা হয় ngFormআপডেট করা হয়। সংযুক্ত উপাদানটি (যেমন ট্যাগসম্পোক্তর) সংযুক্ত করার পরে, আমরা এই মানটি পাস করার জন্য এটি কল করতে সক্ষম হবো (পূর্ববর্তী setValueপদ্ধতিটি দেখুন)।

CUSTOM_VALUE_ACCESSORনির্দেশের বাইন্ডিংগুলিতে সরবরাহ করতে ভুলবেন না ।

এখানে কাস্টমটির সম্পূর্ণ কোডটি রয়েছে ControlValueAccessor:

import {TagsComponent} from './app.tags.ngform';

const CUSTOM_VALUE_ACCESSOR = CONST_EXPR(new Provider(
  NG_VALUE_ACCESSOR, {useExisting: forwardRef(() => TagsValueAccessor), multi: true}));

@Directive({
  selector: 'tags',
  host: {'(tagsChange)': 'onChange($event)'},
  providers: [CUSTOM_VALUE_ACCESSOR]
})
export class TagsValueAccessor implements ControlValueAccessor {
  onChange = (_) => {};
  onTouched = () => {};

  constructor(private host: TagsComponent) { }

  writeValue(value: any): void {
    this.host.setValue(value);
  }

  registerOnChange(fn: (_: any) => void): void { this.onChange = fn; }
  registerOnTouched(fn: () => void): void { this.onTouched = fn; }
}

এইভাবে আমি যখন সমস্ত tagsকোম্পানির সমস্ত অপসারণ করি তখন নিয়ন্ত্রণের validবৈশিষ্ট্যটি স্বয়ংক্রিয়ভাবে companyForm.controls.tagsহয়ে যায় false

আরও তথ্যের জন্য এই নিবন্ধটি (বিভাগ "এনজিএমডেল-সামঞ্জস্যপূর্ণ উপাদান") দেখুন:


ধন্যবাদ! তুমি অসাধারণ! আপনি কীভাবে ভাবেন - এই উপায়টি কি আসলেই ভাল? আমি বলতে চাইছি: ইনপুট উপাদান ব্যবহার করবেন না এবং নিজের মতো নিয়ন্ত্রণগুলি তৈরি করবেন না: <textfield>, <dropdown>? এটি কি "কৌণিক" উপায়?
মাকসিম ফমিন

4
আমি বলব যদি আপনি নিজের ক্ষেত্রটি ফর্মটিতে (কিছু কাস্টম) প্রয়োগ করতে চান তবে এই পদ্ধতির ব্যবহার করুন। অন্যথায় নেটিভ এইচটিএমএল উপাদানগুলি ব্যবহার করুন। এটি বলেছে যে আপনি যদি ইনপুট / টেক্সারিয়া / নির্বাচনের উপায়টিকে মডুলারি করতে চান / উদাহরণস্বরূপ (বুটস্ট্রা ৩.৫ সহ), আপনি এনজি-কন্টেন্টটি উত্তোলন করতে পারবেন। এই উত্তরটি দেখুন: স্ট্যাকওভারফ্লো.com
থিয়েরি টেম্পিয়ারার

4
উপরের কোডটি অনুপস্থিত এবং এতে কিছুটা ত্রুটি রয়েছে যেমন 'রিমুভ্যালবেল' এর পরিবর্তে 'অপসারণ লেবেল'। একটি সম্পূর্ণ কাজের উদাহরণের জন্য এখানে দেখুন । প্রাথমিক উদাহরণ সেখানে রাখার জন্য থিয়েরিকে ধন্যবাদ!
নীল

4
এটি পাওয়া গেছে, @ কৌনিক / সাধারণের পরিবর্তে @ কৌনিক / ফর্মগুলি থেকে আমদানি করুন এবং এটি কার্যকর। '@ কৌণিক / ফর্ম' থেকে import NG_VALUE_ACCESSOR, কন্ট্রোলভ্যালুএ্যাকসেসর import আমদানি করুন;
ক্যাগাটে সিভিসি


115

আমি বুঝতে পারি না যে আমি ইন্টারনেটে যে প্রতিটি উদাহরণ পাই তা কেন এত জটিল হতে হয়। নতুন ধারণাটি ব্যাখ্যা করার সময়, আমি মনে করি সর্বাধিক সহজ, কার্যক্ষম উদাহরণ সম্ভব হওয়াই সর্বদা সেরা। আমি এটিকে কিছুটা নিচে ফেলেছি:

এনজিএম মডেল উপাদান প্রয়োগ করে বহিরাগত ফর্মের জন্য এইচটিএমএল:

EmailExternal=<input [(ngModel)]="email">
<inputfield [(ngModel)]="email"></inputfield>

স্ব-অন্তর্ভুক্ত উপাদান (কোনও পৃথক 'অ্যাক্সেসর' শ্রেণি নেই - সম্ভবত আমি পয়েন্টটি মিস করছি):

import {Component, Provider, forwardRef, Input} from "@angular/core";
import {ControlValueAccessor, NG_VALUE_ACCESSOR, CORE_DIRECTIVES} from "@angular/common";

const CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR = new Provider(
  NG_VALUE_ACCESSOR, {
    useExisting: forwardRef(() => InputField),
    multi: true
  });

@Component({
  selector : 'inputfield',
  template: `<input [(ngModel)]="value">`,
  directives: [CORE_DIRECTIVES],
  providers: [CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR]
})
export class InputField implements ControlValueAccessor {
  private _value: any = '';
  get value(): any { return this._value; };

  set value(v: any) {
    if (v !== this._value) {
      this._value = v;
      this.onChange(v);
    }
  }

    writeValue(value: any) {
      this._value = value;
      this.onChange(value);
    }

    onChange = (_) => {};
    onTouched = () => {};
    registerOnChange(fn: (_: any) => void): void { this.onChange = fn; }
    registerOnTouched(fn: () => void): void { this.onTouched = fn; }
}

আসলে, আমি এই সমস্ত স্টাফটিকে কেবল একটি বিমূর্ত ক্লাসে বিমূর্ত করেছি যা এখন আমি এনজিমোডেল ব্যবহারের জন্য প্রয়োজনীয় প্রতিটি উপাদান দিয়ে প্রসারিত করব। আমার জন্য এটি ওভারহেড এবং বয়লারপ্লেট কোডের একটি টন যা আমি ছাড়াই করতে পারি।

সম্পাদনা: এটি এখানে:

import { forwardRef } from '@angular/core';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';

export abstract class AbstractValueAccessor implements ControlValueAccessor {
    _value: any = '';
    get value(): any { return this._value; };
    set value(v: any) {
      if (v !== this._value) {
        this._value = v;
        this.onChange(v);
      }
    }

    writeValue(value: any) {
      this._value = value;
      // warning: comment below if only want to emit on user intervention
      this.onChange(value);
    }

    onChange = (_) => {};
    onTouched = () => {};
    registerOnChange(fn: (_: any) => void): void { this.onChange = fn; }
    registerOnTouched(fn: () => void): void { this.onTouched = fn; }
}

export function MakeProvider(type : any){
  return {
    provide: NG_VALUE_ACCESSOR,
    useExisting: forwardRef(() => type),
    multi: true
  };
}

এখানে এটির একটি উপাদান রয়েছে যা এটি ব্যবহার করে: (টিএস):

import {Component, Input} from "@angular/core";
import {CORE_DIRECTIVES} from "@angular/common";
import {AbstractValueAccessor, MakeProvider} from "../abstractValueAcessor";

@Component({
  selector : 'inputfield',
  template: require('./genericinput.component.ng2.html'),
  directives: [CORE_DIRECTIVES],
  providers: [MakeProvider(InputField)]
})
export class InputField extends AbstractValueAccessor {
  @Input('displaytext') displaytext: string;
  @Input('placeholder') placeholder: string;
}

এইচটিএমএল:

<div class="form-group">
  <label class="control-label" >{{displaytext}}</label>
  <input [(ngModel)]="value" type="text" placeholder="{{placeholder}}" class="form-control input-md">
</div>

4
মজার বিষয় হচ্ছে, গৃহীত উত্তরটি আরসি 2 এর পরে থেকে কাজ করা বন্ধ করে দিয়েছে বলে মনে হচ্ছে, আমি এই পদ্ধতির চেষ্টা করেছি এবং এটি কেন কাজ করছে তা নিশ্চিত নয়।
3urdoch

4
@ 3ুরডাক শিওর, এক সেকেন্ড
ডেভিড

6
এটি @angular/formsকেবলমাত্র নতুন আপডেট আমদানি দিয়ে কাজ করতে : import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'
ulfryk

6
সরবরাহকারী () অ্যাঙ্গুলার 2 ফাইনালে সমর্থিত নয়। পরিবর্তে, MakeProvider () রিটার্ন} সরবরাহ করুন: NG_VALUE_ACCESSOR, ব্যবহারের উপস্থিতি: ফরোয়ার্ড রেফ (() => টাইপ), বহু: সত্য};
ডিএসোভা

4
অ্যাঙ্গুলার 2 চূড়ান্ত হওয়ার পরে এগুলি ডিফল্টরূপে সরবরাহ করা CORE_DIRECTIVESহওয়ায় আপনার @Componentআর এগুলি আমদানি এবং যুক্ত করার দরকার নেই। তবে, আমার আইডিই অনুসারে, "উত্সযুক্ত শ্রেণীর জন্য কনস্ট্রাক্টরদের অবশ্যই একটি 'সুপার' কল থাকতে হবে" "সুতরাং আমাকে super();আমার উপাদানগুলির কনস্ট্রাক্টরের সাথে যুক্ত করতে হয়েছিল।
জোসেফ ওয়েবার

16

আরসি 5 সংস্করণের জন্য এই লিঙ্কে একটি উদাহরণ রয়েছে: http://almerosteyn.com/2016/04/linkup-custom-control-to-ngcontrol-ngmodel

import { Component, forwardRef } from '@angular/core';
import { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';

const noop = () => {
};

export const CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR: any = {
    provide: NG_VALUE_ACCESSOR,
    useExisting: forwardRef(() => CustomInputComponent),
    multi: true
};

@Component({
    selector: 'custom-input',
    template: `<div class="form-group">
                    <label>
                        <ng-content></ng-content>
                        <input [(ngModel)]="value"
                                class="form-control"
                                (blur)="onBlur()" >
                    </label>
                </div>`,
    providers: [CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR]
})
export class CustomInputComponent implements ControlValueAccessor {

    //The internal data model
    private innerValue: any = '';

    //Placeholders for the callbacks which are later providesd
    //by the Control Value Accessor
    private onTouchedCallback: () => void = noop;
    private onChangeCallback: (_: any) => void = noop;

    //get accessor
    get value(): any {
        return this.innerValue;
    };

    //set accessor including call the onchange callback
    set value(v: any) {
        if (v !== this.innerValue) {
            this.innerValue = v;
            this.onChangeCallback(v);
        }
    }

    //Set touched on blur
    onBlur() {
        this.onTouchedCallback();
    }

    //From ControlValueAccessor interface
    writeValue(value: any) {
        if (value !== this.innerValue) {
            this.innerValue = value;
        }
    }

    //From ControlValueAccessor interface
    registerOnChange(fn: any) {
        this.onChangeCallback = fn;
    }

    //From ControlValueAccessor interface
    registerOnTouched(fn: any) {
        this.onTouchedCallback = fn;
    }

}

এরপরে আমরা এই কাস্টম নিয়ন্ত্রণটি নিম্নরূপ ব্যবহার করতে সক্ষম হচ্ছি:

<form>
  <custom-input name="someValue"
                [(ngModel)]="dataModel">
    Enter data:
  </custom-input>
</form>

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

5

থিয়েরির উদাহরণ সহায়ক। ট্যাগসভ্যালুএ্যাকসেসরটি চালানোর জন্য প্রয়োজনীয় যে আমদানিগুলি এখানে ...

import {Directive, Provider} from 'angular2/core';
import {ControlValueAccessor, NG_VALUE_ACCESSOR } from 'angular2/common';
import {CONST_EXPR} from 'angular2/src/facade/lang';
import {forwardRef} from 'angular2/src/core/di';

1

আমি একটি লাইব্রেরি এই ক্ষেত্রে জন্য কিছু boilerplate কমাতে সাহায্য করে লিখেছিলেন: s-ng-utils। অন্যান্য উত্তরগুলির মধ্যে কয়েকটি একক ফর্ম নিয়ন্ত্রণ মোড়ানো উদাহরণ দিচ্ছে । ব্যবহারs-ng-utils খুব সহজভাবে ব্যবহার করা যেতে পারে WrappedFormControlSuperclass:

@Component({
    template: `
      <!-- any fancy wrapping you want in the template -->
      <input [formControl]="formControl">
    `,
    providers: [provideValueAccessor(StringComponent)],
})
class StringComponent extends WrappedFormControlSuperclass<string> {
  // This looks unnecessary, but is required for Angular to provide `Injector`
  constructor(injector: Injector) {
    super(injector);
  }
}

আপনার পোস্টে আপনি উল্লেখ করেছেন যে আপনি একক উপাদানগুলিতে একাধিক ফর্ম নিয়ন্ত্রণগুলি মোড়াতে চান। এখানে একটি পূর্ণ সঙ্গে কাজ যে উদাহরণ FormControlSuperclass

import { Component, Injector } from "@angular/core";
import { FormControlSuperclass, provideValueAccessor } from "s-ng-utils";

interface Location {
  city: string;
  country: string;
}

@Component({
  selector: "app-location",
  template: `
    City:
    <input
      [ngModel]="location.city"
      (ngModelChange)="modifyLocation('city', $event)"
    />
    Country:
    <input
      [ngModel]="location.country"
      (ngModelChange)="modifyLocation('country', $event)"
    />
  `,
  providers: [provideValueAccessor(LocationComponent)],
})
export class LocationComponent extends FormControlSuperclass<Location> {
  location!: Location;

  // This looks unnecessary, but is required for Angular to provide `Injector`
  constructor(injector: Injector) {
    super(injector);
  }

  handleIncomingValue(value: Location) {
    this.location = value;
  }

  modifyLocation<K extends keyof Location>(field: K, value: Location[K]) {
    this.location = { ...this.location, [field]: value };
    this.emitOutgoingValue(this.location);
  }
}

এর পরে আপনি ব্যবহার করতে পারেন <app-location>সঙ্গে [(ngModel)], [formControl], কাস্টম ভ্যালিডেটর - সবকিছু আপনি বাক্সের বাইরে নিয়ন্ত্রণ সঙ্গে কৌণিক সমর্থন করতে পারেন।


-1

আপনি @ ভিউচিল্ড নির্দেশের মাধ্যমেও এটি সমাধান করতে পারেন। এটি ইনজেকশনের সন্তানের সমস্ত সদস্যের ভেরিয়েবল এবং ফাংশনে পিতামাতাকে সম্পূর্ণ অ্যাক্সেস দেয়।

দেখুন: ইনজেকশনের ফর্ম উপাদানগুলির ইনপুট ক্ষেত্রগুলিতে কীভাবে অ্যাক্সেস করবেন


হ্যাকের মতো শোনাচ্ছে :(
রিলেপি

-1

আপনি যখন অভ্যন্তরীণ এনজিমোডেল ব্যবহার করতে পারেন তখন কেন নতুন মান অ্যাক্সেসর তৈরি করবেন। আপনি যখনই কোনও কাস্টম উপাদান তৈরি করছেন যা এতে একটি ইনপুট রয়েছে [এনজিমোডেল], আমরা ইতিমধ্যে একটি কন্ট্রোলভ্যালুঅ্যাকসেসর ইনস্ট্যান্ট করছি। এবং এটি আমাদের প্রয়োজন অ্যাক্সেসর।

টেমপ্লেট:

<div class="form-group" [ngClass]="{'has-error' : hasError}">
    <div><label>{{label}}</label></div>
    <input type="text" [placeholder]="placeholder" ngModel [ngClass]="{invalid: (invalid | async)}" [id]="identifier"        name="{{name}}-input" />    
</div>

উপাদান:

export class MyInputComponent {
    @ViewChild(NgModel) innerNgModel: NgModel;

    constructor(ngModel: NgModel) {
        //First set the valueAccessor of the outerNgModel
        this.outerNgModel.valueAccessor = this.innerNgModel.valueAccessor;

        //Set the innerNgModel to the outerNgModel
        //This will copy all properties like validators, change-events etc.
        this.innerNgModel = this.outerNgModel;
    }
}

হিসাবে ব্যবহত:

<my-input class="col-sm-6" label="First Name" name="firstname" 
    [(ngModel)]="user.name" required 
    minlength="5" maxlength="20"></my-input>

যদিও এটি আশাব্যঞ্জক বলে মনে হচ্ছে, যেহেতু আপনি সুপারকে কল করছেন, একটি অনুপস্থিত "প্রসারিত" আছে
ডেভ নোটেজ

4
হ্যাঁ, আমি এখানে আমার সম্পূর্ণ কোডটি অনুলিপি করিনি এবং সুপার () সরাতে ভুলে গেছি।
নিশান্ত

9
এছাড়াও, বাইরেরএনজি মডেলটি কোথা থেকে আসে? এই উত্তরটি সম্পূর্ণ কোডের সাথে আরও ভাল পরিবেশিত হবে
ডেভ নোটেজ

Angular.io/docs/ts/latest/api/core/index/… অনুযায়ী innerNgModelসংজ্ঞায়িত করা হয়েছেngAfterViewInit
মাত্তিও সাপো

4
এটি মোটেই কাজ করে না। ইনারএনজিমোডেল কখনই আরম্ভ হয় না, বাইরেরএনজি মডেলটি কখনই ঘোষিত হয় না এবং এনজিওমোডেলটি কনস্ট্রাক্টরকে দেওয়া কখনও ব্যবহৃত হয় না।
ব্যবহারকারী 2350838

-1

এটি করা বেশ সহজ ControlValueAccessor NG_VALUE_ACCESSOR

আপনি একটি সহজ কাস্টম ক্ষেত্র তৈরি করতে এই নিবন্ধটি পড়তে পারেন কৌনিক সহ কাস্টম ইনপুট ফিল্ড উপাদান তৈরি করুন


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