我在Angular 5中构建了一个动态表单组件(基于https://angular.io/guide/dynamic-form的文档和示例)。
一切正常,直到我尝试使用棱角分明的材料。
我在这里已经阅读过类似问题的一些文章,但它们似乎都是因为人们没有导入正确的模块或使用mdInput或mat-Input而不是matInput。对于我遇到的问题,情况并非如此。
任何想法或建议都将不胜感激。
更改代码 - 带有错误的突破 -
* mat-form-field必须包含MatFormFieldControl。***
动态表单控件组件模板
我对下面的工作代码所做的唯一更改是将输入字段包装起来并将matInput属性添加到输入字段。
我正在通过核心模块导入所有材料模块(MatFormFieldModule和MatInputModule等。我的所有材料输入和表单字段都适用于应用程序中的所有其他组件,所以我不相信问题是我是在进口中缺少任何东西。
<div [formGroup]="form">
<div [ngSwitch]="control.controlType">
<mat-form-field>
<input matInput placeholder="{{control.label}}" *ngSwitchCase="'textbox'" [formControlName]="control.key" [id]="control.key"
[type]="control.type">
</mat-form-field>
<select [id]="control.label" *ngSwitchCase="'dropdown'" [formControlName]="control.key">
<option value="">Select {{control.label}}</option>
<option *ngFor="let opt of control.options" [value]="opt.key">{{opt.value}}</option>
</select>
</div>
<div class="errorMessage" *ngIf="!isValid">{{control.label}} is required</div>
</div>
当前代码 - 这完美无缺,但我没有获得角度素材格式
选择
<mi-dynamic-form [controls]="controls"></mi-dynamic-form>
动态表单组件
import { Component, Input } from '@angular/core';
import { FormGroup, FormControl } from '@angular/forms';
import { DynamicFormBase } from './dynamic-form-base';
@Component({
selector: 'mi-control',
templateUrl: './dynamic-form-control.component.html'
})
export class DynamicFormControlComponent {
// API
@Input() control: DynamicFormBase<any>;
@Input() form: FormGroup;
get isValid() { return this.form.controls[this.control.key].valid; }
}
动态表单组件模板
<div [formGroup]="form">
<div [ngSwitch]="control.controlType">
<input placeholder="{{control.label}}" *ngSwitchCase="'textbox'" [formControlName]="control.key" [id]="control.key"
[type]="control.type">
<select [id]="control.label" *ngSwitchCase="'dropdown'" [formControlName]="control.key">
<option value="">Select {{control.label}}</option>
<option *ngFor="let opt of control.options" [value]="opt.key">{{opt.value}}</option>
</select>
</div>
<div class="errorMessage" *ngIf="!isValid">{{control.label}} is required</div>
</div>
动态表单控件组件
import { Component, Input } from '@angular/core';
import { FormGroup, FormControl } from '@angular/forms';
import { DynamicFormBase } from './dynamic-form-base';
@Component({
selector: 'mi-control',
templateUrl: './dynamic-form-control.component.html'
})
export class DynamicFormControlComponent {
// API
@Input() control: DynamicFormBase<any>;
@Input() form: FormGroup;
get isValid() { return this.form.controls[this.control.key].valid; }
}
动态表单控件组件模板
<div [formGroup]="form">
<!-- <label [attr.for]="control.key">{{control.label}}</label> -->
<div [ngSwitch]="control.controlType">
<mat-form-field>
<input matInput placeholder="{{control.label}}" *ngSwitchCase="'textbox'" [formControlName]="key" [id]="control.key"
[type]="control.type">
</mat-form-field>
<mat-select [id]="control.label" *ngSwitchCase="'dropdown'" [formControlName]="control.key">
<mat-option value="">Select {{control.label}}</mat-option>
<mat-option *ngFor="let opt of control.options" [value]="opt.key">{{opt.value}}</mat-option>
</mat-select>
</div>
<div class="errorMessage" *ngIf="!isValid">{{control.label}} is required</div>
</div>
答案 0 :(得分:0)
我确定您已经解决了这个问题。 mat-form-field错误必须包含MatFormFieldControl。表示未导入所使用的材料组件。即,使用mat-button指令时需要导入MatButtonModule。
答案 1 :(得分:0)
我能够同时与Angular Dynamic Forms和Material一起使用。查看stackblitz示例here的工作示例,该示例同时显示了动态表单和材料的使用。