准备工作
使用ng new async-form创建一个新工程,在app.module.ts中引入ReactiveFormsModule模块并在根模块中导入
import { ReactiveFormsModule } from '@angular/forms';
@NgModule({
imports: [
ReactiveFormsModule
]
})
构建表单元素的基类
export class QuestionBase<T> {
value: T;//表单元素的值
key: string;//表单元素键的名称
label: string;//输入元素的标题
required: boolean;//是否必输
order: number;//排序
controlType: string;//表单的类型 选择框/文本输入框
constructor(options: {
value"htmlcode">
import { QuestionBase } from './question-base';
export class QuestionDropdown extends QuestionBase<string>{
controlType = "dropdown";
options: { key: string, value: string }[] = [];
constructor(options: {} = {}) {
super(options);
this.options = options["options"] || [];
}
}
文本输入框元素的数据类型继承了基类,设置了controlType 为'textbox',新增了type属性,定义input的类型
import { QuestionBase } from './question-base';
export class QuestionTextbox extends QuestionBase<string> {
controlType = "textbox";
type:string;
constructor(options:{} ={}){
super(options);
this.type = options["type"]||""
}
}
生成数据
根据表单元素的派生类生成表单的数据。可以引入一个服务类,提供表单数据。
getQuestions(){
let questions:QuestionBase<any>[]=[
new QuestionDropdown({
key:'brave',
label:'Bravery Rating',
options:[
{key:'solid',value:'Solid'},
{key:'great',value:'Great'},
{key:'good',value:'Good'},
{key:'unproven',value:'Unproven'}
],
order:3
}),
new QuestionTextbox({
key:'firstName',
label:'First name',
value:"Bombasto",
required:true,
order:1
}),
new QuestionTextbox({
key:'emailAddress',
label:"Email",
type:'email',
order:2
})
];
return questions.sort((a, b) => a.order - b.order);
}
将数据转成FormControl类型
可以专门提供一个服务类,将表单的数据转成FormControl类型
toFormGroup(questions: QuestionBase<any>[]) {
let group: any = {};
questions.forEach(question => {
group[question.key] = question.required"",Validators.required)
:new FormControl(question.value||"");
});
return new FormGroup(group);
}
到这里就已经完整构建出一组FormControl 实例了。
为数据提供页面模板
<div [formGroup]="form">
<label [attr.for]="question.key">{{question.label}}</label>
<div [ngSwitch]="question.controlType">
<input *ngSwitchCase="'textbox'" [formControlName]= "question.key"
[id]="question.key" [type]="question.type">
<select [id]="question.key" *ngSwitchCase="'dropdown'"
[formControlName]="question.key">
<option *ngFor="let opt of question.options" [value]="opt.key">
{{opt.value}}
</option>
</select>
</div>
<div class="errorMessage" *ngIf="!isValid">
{{question.label}} is required
</div>
</div>
通过formGroup指令绑定表单数据,ngSwitch指令来选择生成的模板,formControlName指令绑定对应的表单数据的key值
import { Component, OnInit, Input } from '@angular/core';
import {FormGroup} from '@angular/forms';
import {QuestionBase} from '../question-base';
@Component({
selector: 'app-dynamic-form-question',
templateUrl: './dynamic-form-question.component.html',
styleUrls: ['./dynamic-form-question.component.less']
})
export class DynamicFormQuestionComponent implements OnInit {
@Input() question:QuestionBase<any>;
@Input() form :FormGroup;
get isValid(){
return this.form.controls[this.question.key].valid;
}
constructor() { }
ngOnInit() {
}
}
表单组件需要两个输入,form和question,form来获取对应表单的键值是否校验成功,question来渲染对应表单输入元素。使用app-dynamic-form-question标签来使用组件
引用表单组件
<div *ngFor="let question of questions" class="form-row">
<app-dynamic-form-question [question]="question" [form]="form"></app-dynamic-form-question>
</div>
获取到questions数据后,通过*ngFor指令来渲染单个表单组件。
结束
到这里就完成了动态创建表单的功能,以这种方式来创建表单,我们只需要开始时构建出指定的单个输入框或者其他表单元素的样式之后,通过改变数据来控制表单的内容,便于后期维护。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
angular,动态创建表单
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新动态
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]