微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – Angular4 – 没有用于表单控件的值访问器

我有一个自定义元素:

<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_ACCESSORuse 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] 举报,一经查实,本站将立刻删除。

相关推荐