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는 각도 팀이 응답하지 않았지만 매력처럼 작동합니다.
Amare

1
사용중인 타사 패키지에주의하십시오. 이전을 사용하는 것을 가져 FORM_DIRECTIVES오면 앱이 손상됩니다! 적절한 사례 : github.com/valor-software/ng2-charts/issues/352
Pete

저 전에 ngDefaultControl을 추가 [(ngModel)] = "..."일
themightysapien

답변:


73

호스트의 사용자 지정 입력 구성 요소에 ngDefaultControl을 추가하면 문제가 해결되었습니다. @danieleds에게 감사드립니다.


8
이 솔루션은 저에게 효과적이지 않았습니다. 내 이름이 적용되었으며 입력에 input추가하려고 시도했지만 ngDefaultControl작동하지 않았습니다. 여전히 똑같은 오류가 발생했습니다. RC5에서
prolink007

2
동의합니다. html 및 ngDefaultControl에 이름 속성을 추가했는데 formControl을 사용했는데 작동하지 않습니다.
Steve K

1
ngDefaultControl작동 방식 에 대한 아주 좋은 설명을 참조하십시오 -stackoverflow.com/a/46465959/968003 . 기본적으로 ControlValueAccessorAngular 양식 API와 DOM의 기본 요소 사이의 다리 역할을하는 default를 추가합니다 .
Alex Klaus

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명령을 사용하여 게시물을 더 읽기 쉽게 만드십시오.
buhtz

4
나는 RC6를 사용하여 존재하지 않는 오전 FORM_DIRECTIVES@angular/common
Kosmonaft

6
NG2 FINAL에서는 양식 지시문이 더 이상 없습니다
Steve K

4

나는 퍼팅되었다 [(ngModel)]내에서 <option>대신 태그<select>

그래서 그래 ...


그래 .... ngModel을 <mat-radio-group>이 아닌 <mat-radio-button>에 두는 동일한 오류가 발생했습니다. Grrrrrr ....
Mike Gledhill

0

이것이 발생하는 또 다른 시나리오로서, 나는 [(ngModel)]최근에 재 구축되고 단순화 된 사용자 지정 구성 요소를 지정했으며 구성 요소의 새 버전은 ngModel방출이있는 일반 입력 변수로 사용되었습니다.

이것은 충분하지 않았습니다 . 입력 변수의 이름을 다른 이름으로 변경 ngModel하거나 구성 요소가 ControlValueAccessor인터페이스 를 구현해야합니다 ( 자세한 내용은 문서 참조 ). 둘 중 하나가 완료되면 더 이상이 오류가 발생하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.