<div formControlName="surveyType">
<div *ngFor="let type of surveyTypes"
(click)="onSelectType(type)"
[class.selected]="type === selectedType">
<md-icon>{{ type.icon }}</md-icon>
<span>{{ type.description }}</span>
</div>
</div>
当我尝试添加formControlName时,收到一条错误消息:
ERROR Error: No value accessor for form control with name:
‘surveyType’
我试图添加ngDefaultControl但没有成功.
这似乎是因为没有输入/选择…我不知道该怎么做.
我想将我的点击绑定到这个formControl,以便当有人点击整个卡片时将我的’type’推送到formControl.可能吗?
解决方法:
您只能在实现ControlValueAccessor
的指令上使用formControlName.
实现接口
因此,为了做你想做的事,你必须创建一个实现ControlValueAccessor
的组件,这意味着实现以下三个功能:
> writeValue(告诉Angular如何将模型中的值写入视图)
> registerOnChange(注册视图更改时调用的处理函数)
> registerOnTouched(注册在组件接收触摸事件时要调用的处理程序,对于了解组件是否已被聚焦有用).
注册提供商
然后,你必须告诉Angular这个指令是一个ControlValueAccessor(接口不会削减它,因为当TypeScript编译成JavaScript时它会从代码中删除).您可以通过注册提供商来完成此操作.
提供商应提供NG_VALUE_ACCESSOR
和use an existing value.您还需要forwardRef
.请注意,NG_VALUE_ACCESSOR应为multi provider.
例如,如果您的自定义指令名为MyControlComponent,则应在传递给@Component装饰器的对象内的以下行中添加一些内容:
providers: [
{
provide: NG_VALUE_ACCESSOR,
multi: true,
useExisting: forwardRef(() => MyControlComponent),
}
]
您的组件已准备好使用.使用template-driven forms,ngModel绑定现在可以正常工作.
使用reactive forms,您现在可以正确使用formControlName,表单控件将按预期运行.
资源
> Custom Form Controls in Angular by Thoughtram
> Angular Custom Form Controls with Reactive Forms and NgMode by Cory Rylan
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。