如何从ControlValueAccessor获取FormControl实例

Ged*_*lys 13 controls directive accessor angular

我有以下组件:

@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 {
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

<pc-radio-button [formControl]="formControl"></pc-radio-button>
<pc-radio-button [formControlName]="inputControlName"></pc-radio-button>
Run Code Online (Sandbox Code Playgroud)

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

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

Jes*_*sse 23

看来jector.get(NgControl)发出了弃用警告,所以我想提出另一种解决方案:

constructor(public ngControl: NgControl) {
  ngControl.valueAccessor = this;
}
Run Code Online (Sandbox Code Playgroud)

技巧还在于从providers数组中删除NG_VALUE_ACCESSOR,否则会得到循环依赖。

有关此问题的更多信息,请访问Angular团队的Kara Erickson

  • @RemcoVlierman 当我这样做时,我得到“检测到 DI 中的循环依赖” (7认同)
  • 这应该是Angular 7在2019年可接受的解决方案。 (3认同)
  • FWIW,她的演讲完全值得您花时间。但如果您正在寻找特定的“NgControl”位,它会在 [19:07](https://youtu.be/CD_t3m2WMM8?t=1147) 左右开始 (3认同)

yur*_*zui 13

一种可能的解决方案是获取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)
  }
Run Code Online (Sandbox Code Playgroud)

然后你可以获得状态

ngControl.control.status
Run Code Online (Sandbox Code Playgroud)

也可以看看