繁体   English   中英

如何使用ControlValueAccessor?

[英]How to use ControlValueAccessor?

我有一个带有反应形式的自定义组件InputFieldSignupComponent

<ui-input-field formControlName="email" label="email"></ui-input-field>

当我这样做时,我在ui-input-field获得formControlName ,而不是在标签input 怎么解决呢?

我使用ControlValueAccessor但不了解其工作原理(方法writeValue()

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);
  }
}

您的实现中有很多错误之处:

  1. writeValue(obj: any): void函数应用于设置组件中输入控件的值。 您尚未正确实现。
  2. <input>您内元素Component不应该有formControlName它的属性。
  3. registerOnChangeregisterOnTouched提供了一个函数,您在<input>发生更改或被触摸时应调用该函数。 您尚未实现。

文档应提供有关如何进行的足够详细的信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM