在包裹mat-select的自定义组件上使用formControlName时遇到很多问题。
现在看来我的自定义控件找不到表单组了吗?即使自定义元素嵌套在formGroup下。
我有一个StackBlitz
但是,当我将自定义组件嵌套在formGroup下时,就会出现问题,所有其他控件都可以找到formGroup,但我的自定义组件似乎无法。
<form novalidate [formGroup]="tenantForm">
<label for="Id">Id</label>: <input class="form-control" formControlName="id" id="Id" name="Id" />
<custom-component-with-mat-select formControlName="culture" id="Culture" name="Culture"></custom-component-with-mat-select>
</form>
在此示例中,Id字段可以正常工作,但是Culture字段抱怨未嵌套在FormGroup中?
错误:formControlName必须与父formGroup指令一起使用。您将要添加一个formGroup 指令并将其传递给现有的FormGroup实例(您可以在类中创建一个)。
自定义组件应如何与反应式表单和表单组一起使用?
我最初的问题是不记得要导入ReactiveFormsModule ..也许我忘记了再次导入某些内容?
这是answer的设计方法吗?还是我缺少一个更简单的解决方案?
我需要实现一个控制值访问器吗? 如here
所述只是对设计方法感到困惑。
我的组件包装了角材料的mat-select,如果我需要在mat-select上放置属性还是让我的组件实现控制值访问器,我想我也很困惑。似乎没有任何效果。
答案 0 :(得分:1)
控件formControlName
必须是字符串值。
formControlName="animationType"
从animtationType
开始的工作在这里是字符串值。
[formControlName]="'animationType'"
这是引发错误,因为Angular正在评估animationType
的值,该值是一个数组(在ts文件中定义)
formControlName="{{animationType}}"
这与案例2的原因相同
如果要访问formControlName,请在ts中使用字符串值 例如:
** in ts **
public animationControl = "animation";
** in html **
<mat-select name="animationType" [formControlName]="'animationControl'"
答案 1 :(得分:0)
我做了一些研究,并使其与控制值访问器一起工作:
https://stackblitz.com/edit/mat-select-with-controlvalueaccessor
答案 2 :(得分:0)
我使用参数“ formControl”而不是“ formControlName”解决了该问题,如下所示: input-date.compoenent.html
<p-calendar [formControl]="control"></p-calendar>
parent.component.html
<input-date [control]="formGroup.controls.date"></input-date>
其中控件是input-date.component的输入:
@Input() control: FormControl;