时间:2021-05-28
准备工作
使用ng new async-form创建一个新工程,在app.module.ts中引入ReactiveFormsModule模块并在根模块中导入
import { ReactiveFormsModule } from '@angular/forms';@NgModule({ imports: [ ReactiveFormsModule ]})构建表单元素的基类
继承表单元素的基类
选择框元素的数据类型继承基类,设置了controlType 为'dropdown'并新增了属性options数组
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?new FormControl(question.value||"",Validators.required) :new FormControl(question.value||""); }); return new FormGroup(group); }到这里就已经完整构建出一组FormControl 实例了。
为数据提供页面模板
通过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标签来使用组件
引用表单组件
获取到questions数据后,通过*ngFor指令来渲染单个表单组件。
结束
到这里就完成了动态创建表单的功能,以这种方式来创建表单,我们只需要开始时构建出指定的单个输入框或者其他表单元素的样式之后,通过改变数据来控制表单的内容,便于后期维护。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了AngularJS学习笔记之表单验证功能。分享给大家供大家参考,具体如下:一、执行基本的表单验证表单angular.module('example
本文将介绍如何动态创建表单组件,我们最终实现的效果如下:在阅读本文之前,请确保你已经掌握Angular响应式表单和动态创建组件的相关知识,如果对相关知识还不了解
本文实例为大家分享了Angular模板表单校验的方法,供大家参考,具体内容如下1.创建指令nggdirectivedirectives/mobileValida
js学习之动态创建html元素body{margin:0;padding:0;}.sky{background:#000;width:1000;height:5
本文介绍了angular笔记路由之angular-router,分享给大家,具体如下:创建项目ngnewrouter--routing\\加routing参数\