首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用ControlValueAccessor?

如何使用ControlValueAccessor?
EN

Stack Overflow用户
提问于 2018-05-25 11:43:29
回答 1查看 532关注 0票数 0

我有一个带有反应性表单的自定义组件InputFieldSignupComponent

代码语言:javascript
复制
<ui-input-field formControlName="email" label="email"></ui-input-field>

当我这样做的时候,我得到的是formControlName in ui-input-field,而不是标记input。如何解决这个问题?

我使用ControlValueAccessor,但不明白它是如何工作的(writeValue()方法)

代码语言:javascript
复制
import { Component, forwardRef, Input, OnInit } from '@angular/core';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';

@Component({
  selector: 'ui-input-field',
  template: `
  <div class="group">
    <input  required [formControlName] />
    <span class="bar"></span>
    <label>{{label}}</label>
</div>
    `,
  styleUrls: ['input.component.css'],
  providers: [
    {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => InputFieldComponent),
      multi: true
    }]
})

export class InputFieldComponent implements OnInit, ControlValueAccessor {
  @Input() label: string;
  constructor() { }

  ngOnInit() {
  }    

  writeValue(value) {
    if (!value || typeof value !== 'string') {
      console.log('not value');
      return;
    }
  }    

  onChange: any = () => {
  }
  onTouched: any = () => {
  }

  registerOnChange(fn) {
    this.onChange(fn);
  }
  registerOnTouched(fn) {
    this.onTouched(fn);
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-25 12:19:29

在您的实现中有许多不正确的地方:

  1. 应该使用writeValue(obj: any): void函数来设置组件中输入控件的值。您还没有正确地实现这一点。
  2. <input>元素在您的Component中不应该包含formControlName属性。
  3. registerOnChangeregisterOnTouched提供了一个函数,只要您的<input>更改或被触摸,就应该调用它们。你还没有实现这一点。

文档应该提供更多关于如何进行操作的详细信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50528443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档