이와 같은 간단한 사용자 지정 입력 구성 요소가 있습니다.
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;
}
답변
호스트의 사용자 지정 입력 구성 요소에 ngDefaultControl을 추가하면 문제가 해결되었습니다. @danieleds에게 감사드립니다.
답변
사용자 지정 입력 구성 요소에 ngDefaultControl을 추가합니다. 이렇게하면 양방향 데이터 바인딩이 추가되므로 고유 한 작업을 수행하지 않는 한 값 접근 자 메서드를 구현할 필요가 없습니다.
<custom-input name="firstName" [(ngModel)]="firstName" ngDefaultControl></custom-input>
답변
ngDefaultControl
입력에 추가 하십시오. 예
<inline-editor type="textarea" [(ngModel)]="editableTextArea" (onSave)="saveEditable($event)" value="valor" ngDefaultControl> </inline-editor>
그런 다음 import { FORM_DIRECTIVES } from '@angular/common'
;
마지막으로 지시문 : [FORM_DIRECTIVES]
이것은 작동합니다 🙂 위의 의견에 감사드립니다
답변
나는 퍼팅되었다 [(ngModel)]
내에서 <option>
대신 태그<select>
그래서 그래 …
답변
이것이 발생하는 또 다른 시나리오로서, 나는 [(ngModel)]
최근에 재 구축되고 단순화 된 사용자 지정 구성 요소를 지정했으며 구성 요소의 새 버전은 ngModel
방출이있는 일반 입력 변수로 사용되었습니다.
이것은 충분하지 않았습니다 . 입력 변수의 이름을 다른 이름으로 변경 ngModel
하거나 구성 요소가 ControlValueAccessor
인터페이스 를 구현해야합니다 ( 자세한 내용은 문서 참조 ). 둘 중 하나가 완료되면 더 이상이 오류가 발생하지 않습니다.