angular2 rc.5 कस्टम इनपुट, अनिर्दिष्ट नाम के साथ फॉर्म नियंत्रण के लिए कोई मूल्य अभिगमकर्ता नहीं


80

मेरे पास इस तरह से सरल कस्टम इनपुट घटक है,

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

const noop = () => {};

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

@Component({
  selector: 'custom-input',
  template: `

          <input class="form-control" 
                 [(ngModel)]="value" name="somename"
                 (blur)="onTouched()">

  `,
  providers: [CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR]
})
export class CustomInputComponent implements ControlValueAccessor{

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

  //Placeholders for the callbacks
  private _onTouchedCallback: () => void = noop;

  private _onChangeCallback: (_:any) => void = noop;

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

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

  //Set touched on blur
  onTouched(){
    this._onTouchedCallback();
  }

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

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

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

}

और मेरे पास इस तरह ऐप मॉड्यूल है,

/**
 * Created by amare on 8/15/16.
 */
import { NgModule }                     from '@angular/core';
import { BrowserModule }                from '@angular/platform-browser';
import { ReactiveFormsModule, FormsModule }          from '@angular/forms';
import { AppComponent }                 from './app/app.component';
import {CustomInputComponent} from "./app/shared/custom.input.component";
import {RouterModule} from "@angular/router";
@NgModule({
  imports: [ BrowserModule, ReactiveFormsModule, FormsModule, RouterModule ],
  declarations: [ AppComponent, CustomInputComponent],
  bootstrap: [ AppComponent ]
})
export class AppModule {  
}

और मुख्य

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule }              from './app.module';

platformBrowserDynamic().bootstrapModule(AppModule);

और मैंने अपने कस्टम इनपुट का उपयोग अपने घटकों में से एक के रूप में किया है, जैसा कि नीचे दिखाया गया है, लेकिन 'अनिर्दिष्ट नाम विशेषता के साथ फॉर्म नियंत्रण के लिए कोई मूल्य अभिगमकर्ता' नहीं मिल रहा है।

<custom-input name="firstName" [(ngModel)]="firstName"></custom-input>

और app.component इस तरह दिखता है

import { Component } from '@angular/core';

@Component({
  moduleId: module.id,
  selector: 'app-root',
  templateUrl: 'app.component.html',
  styleUrls: ['app.component.css']
})
export class AppComponent {
  title = 'app works!';

  firstName: string;
}

मैं एक कस्टम निर्देश के साथ एक ही मुद्दा है जो ControlValueAccessor को लागू करता है। यह RC4 में काम कर रहा था, लेकिन आपको RC5 के समान त्रुटि मिलती है। किसी से आशा करना एक समाधान है।
user2444499

38
ngDefaultControlअपने नियंत्रण में इस तरह जोड़ने का प्रयास करें:<custom-input name="firstName" [(ngModel)]="firstName" ngDefaultControl></custom-input>
danieleds

@danieleds धन्यवाद इतना आकर्षण की तरह काम करता है, भले ही कोणीय टीम जवाब नहीं दे रही थी।
आमरे १

1
आपके द्वारा उपयोग किए जा रहे किसी भी 3-पार्टी पैकेज से सावधान रहें - यदि आप कुछ भी आयात करते हैं जो पुराने का उपयोग कर रहा है FORM_DIRECTIVES, तो यह आपके ऐप को तोड़ देगा! बिंदु में मामला: github.com/valor-software/ng2-charts/issues/352
पीट

मेरे लिए ngDefaultControl जोड़ने से पहले [(ngModel)] = "...." काम किया
heightysapien

जवाबों:


73

होस्ट में कस्टम इनपुट घटक के लिए ngDefaultControl को जोड़ने से समस्या हल हो गई, धन्यवाद @danieleds


8
यह समाधान मेरे काम नहीं आया। मेरे पास एक नाम लागू है inputऔर मैंने ngDefaultControlइनपुट में जोड़ने की भी कोशिश की और यह काम नहीं किया। फिर भी मुझे वही त्रुटि दी। RC5 में
prolink007

2
सहमत हूं, मैंने html और ngDefaultControl में नाम संपत्ति जोड़ी है और मैं फॉर्मकंट्रोल का उपयोग करता हूं और यह काम नहीं करता है।
स्टीव के

1
कैसे ngDefaultControlकाम करता है पर एक बहुत अच्छी व्याख्या देखें - stackoverflow.com/a/46465959/968003 । अनिवार्य रूप से, यह डिफ़ॉल्ट जोड़ता है ControlValueAccessor, जो कोणीय रूपों एपीआई और डोम में एक मूल तत्व के बीच एक पुल के रूप में कार्य करता है।
एलेक्स

46

कस्टम-इनपुट घटक में ngDefaultControl जोड़ें। यह दो-तरफ़ा डेटाबाइंडिंग जोड़ता है, जब तक आप कुछ अनोखा नहीं कर रहे हैं तब तक आपको मूल्य अभिगम विधियों को लागू नहीं करना चाहिए।

<custom-input name="firstName" [(ngModel)]="firstName" ngDefaultControl></custom-input>

12

ngDefaultControlअपने इनपुट में जोड़ें । जैसे

<inline-editor type="textarea" [(ngModel)]="editableTextArea" (onSave)="saveEditable($event)" value="valor" ngDefaultControl> </inline-editor> 

तब import { FORM_DIRECTIVES } from '@angular/common';

अंत में निर्देश: [FORM_DIRECTIVES]

यह काम करेगा :) उपरोक्त टिप्पणियों के लिए धन्यवाद


2
कृपया markdownअपने पोस्ट को अधिक पठनीय बनाने के लिए backticks और अन्य कमांड का उपयोग करें।
buhtz

4
मैं RC6 उपयोग कर रहा हूँ और वहाँ नहीं है FORM_DIRECTIVESमें@angular/common
Kosmonaft

6
फार्म डाइरेक्ट एनजी 2 फाइनल के साथ कोई अधिक नहीं हैं
स्टीव के

4

मैं इसके बजाय [(ngModel)]अपने <option>टैग पर लगा रहा था<select>

तो हाँ ... यह इस कारण होगा।


हाँ .... मुझे एक ही त्रुटि मिली, <मैट-रेडियो-ग्रुप> के बजाय एक <mat-Radio-button> पर ngModel डालने की। ग्र्र्र्रर्र…।
माइक गिल्डहिल

0

एक और परिदृश्य के रूप में जहां यह सामने आता है, मैंने [(ngModel)]एक कस्टम घटक पर निर्दिष्ट किया था जिसे हाल ही में फिर से बनाया गया था और सरलीकृत किया गया था, और घटक के नए संस्करण में केवल ngModelउत्सर्जन के साथ एक सामान्य इनपुट चर के रूप में था ।

यह पर्याप्त नहीं था - इनपुट चर को इसके अलावा कुछ नाम दिया जाना चाहिए ngModel, या घटक को ControlValueAccessorइंटरफ़ेस लागू करना होगा ( विवरण के लिए डॉक्स देखें )। एक या दूसरा पूरा होने के बाद, आपको यह त्रुटि नहीं मिलेगी।

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