如何从ControlValueAccessor

时间:2017-08-18 11:48:48

标签: angular controls directive accessor

我有以下组件:

@Component({
    selector: 'pc-radio-button',
    templateUrl: './radio-button.component.html',
    providers: [
        {provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => FieldRadioButtonComponent), multi: true}
    ]
})
export class RadioButtonComponent implements ControlValueAccessor {
    ...
}

我可以通过这些输入分配和更改值:

<pc-radio-button [formControl]="formControl"></pc-radio-button>
<pc-radio-button [formControlName]="inputControlName"></pc-radio-button>

但是我需要组件可以直接访问指定的formControl,因为我需要根据其状态添加样式。

通过创建 @Input()formControl 无法解决问题。因为它不包括通过formControlName分配表单控件的情况。

3 个答案:

答案 0 :(得分:10)

一种可能的解决方案是通过NgControl获取Injector个实例:

import { NgControl } from '@angular/forms';
export class PasswordComponent implements ControlValueAccessor {
  ...
  ngControl: NgControl;

  constructor(private inj: Injector) {
    ...
  }

  ngOnInit() {
    this.ngControl = this.inj.get(NgControl)
  }

然后你可以得到像

这样的状态
ngControl.control.status

另见

答案 1 :(得分:8)

好像是jector.get(NgControl)抛出了弃用警告,所以我想使用其他解决方案:

constructor(public ngControl: NgControl) {
  ngControl.valueAccessor = this;
}

诀窍是还要从providers数组中删除NG_VALUE_ACCESSOR,否则会得到循环依赖。

关于此的更多信息,请参见this talk by Kara Erickson of the Angular team

答案 2 :(得分:0)

来自我对此stackblitz question的回答

另一个解决方案是添加为提供程序NG_VALIDATORS。因此,在我们的函数验证中,我们可以将控件存储在变量中

public validate(c: FormControl) {
  if (!this.control)
    this.control=c;
  return null;

请参见stackblitz