最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

angular學(xué)習(xí)之動態(tài)創(chuàng)建表單的方法

 更新時間:2018年12月07日 09:11:03   作者:huangmin16  
這篇文章主要介紹了angular學(xué)習(xí)之動態(tài)創(chuàng)建表單的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

準(zhǔn)備工作

使用ng new async-form創(chuàng)建一個新工程,在app.module.ts中引入ReactiveFormsModule模塊并在根模塊中導(dǎo)入

import { ReactiveFormsModule } from '@angular/forms';
@NgModule({
 imports: [
  ReactiveFormsModule
 ]
})

構(gòu)建表單元素的基類

export class QuestionBase<T> {
  value: T;//表單元素的值
  key: string;//表單元素鍵的名稱
  label: string;//輸入元素的標(biāo)題
  required: boolean;//是否必輸
  order: number;//排序
  controlType: string;//表單的類型 選擇框/文本輸入框

  constructor(options: {
    value?: T,
    key?: string,
    label?: string,
    required?: boolean,
    order?: number,
    controlType?: string
  } = {}) {
    this.value = options.value;
    this.key = options.key || '';
    this.label = options.label || '';
    this.required = !!options.required;
    this.order = options.order === undefined ? 1 : options.order;
    this.controlType = options.controlType || '';
  }
}

繼承表單元素的基類

選擇框元素的數(shù)據(jù)類型繼承基類,設(shè)置了controlType 為'dropdown'并新增了屬性options數(shù)組

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"] || [];
  }
}

文本輸入框元素的數(shù)據(jù)類型繼承了基類,設(shè)置了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"]||""
  }
}

生成數(shù)據(jù)

根據(jù)表單元素的派生類生成表單的數(shù)據(jù)??梢砸胍粋€服務(wù)類,提供表單數(shù)據(jù)。

 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);
 }

將數(shù)據(jù)轉(zhuǎn)成FormControl類型

可以專門提供一個服務(wù)類,將表單的數(shù)據(jù)轉(zhuǎn)成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);
 }

到這里就已經(jīng)完整構(gòu)建出一組FormControl 實例了。

為數(shù)據(jù)提供頁面模板

<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指令綁定表單數(shù)據(jù),ngSwitch指令來選擇生成的模板,formControlName指令綁定對應(yīng)的表單數(shù)據(jù)的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來獲取對應(yīng)表單的鍵值是否校驗成功,question來渲染對應(yīng)表單輸入元素。使用app-dynamic-form-question標(biāo)簽來使用組件

引用表單組件

  <div *ngFor="let question of questions" class="form-row">
   <app-dynamic-form-question [question]="question" [form]="form"></app-dynamic-form-question>
  </div>

獲取到questions數(shù)據(jù)后,通過*ngFor指令來渲染單個表單組件。

結(jié)束

到這里就完成了動態(tài)創(chuàng)建表單的功能,以這種方式來創(chuàng)建表單,我們只需要開始時構(gòu)建出指定的單個輸入框或者其他表單元素的樣式之后,通過改變數(shù)據(jù)來控制表單的內(nèi)容,便于后期維護。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • AnjularJS中$scope和$rootScope的區(qū)別小結(jié)

    AnjularJS中$scope和$rootScope的區(qū)別小結(jié)

    這篇文章給大家整理了關(guān)于AnjularJS中$scope和$rootScope的區(qū)別,文中運用實例代碼介紹的很詳細,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-09-09
  • SeaJS 與 RequireJS 的差異對比

    SeaJS 與 RequireJS 的差異對比

    這篇文章主要介紹了SeaJS 與 RequireJS 的差異對比,本文主要對CMD規(guī)范和AMD規(guī)范的弊端做了對比,并做出了一個總結(jié),需要的朋友可以參考下
    2014-12-12
  • AngularJS基礎(chǔ) ng-dblclick 指令用法

    AngularJS基礎(chǔ) ng-dblclick 指令用法

    本文主要介紹AngularJS ng-dblclick 指令,這里對ng-dblclick基礎(chǔ)資料整理并詳細介紹,簡單的代碼實例和實現(xiàn)效果,希望能幫助學(xué)習(xí)AngularJS的朋友
    2016-08-08
  • AngularJS ui-router刷新子頁面路由的方法

    AngularJS ui-router刷新子頁面路由的方法

    這篇文章主要介紹了AngularJS ui-router刷新子頁面路由的方法,網(wǎng)上雖然有很多種方法,但是都不適合小編,今天小編給大家分享一個還不錯的方法,需要的朋友可以參考下
    2018-07-07
  • 在Angular中使用JWT認證方法示例

    在Angular中使用JWT認證方法示例

    這篇文章主要介紹了在Angular中使用JWT認證方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • Angular 多模塊項目構(gòu)建過程

    Angular 多模塊項目構(gòu)建過程

    這篇文章主要介紹了Angular 多模塊項目構(gòu)建過程,本文大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • angularjs數(shù)組判斷是否含有某個元素的實例

    angularjs數(shù)組判斷是否含有某個元素的實例

    下面小編就為大家分享一篇angularjs數(shù)組判斷是否含有某個元素的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • Angular中自定義Debounce Click指令防止重復(fù)點擊

    Angular中自定義Debounce Click指令防止重復(fù)點擊

    本篇文章主要介紹了Angular中自定義Debounce Click指令詳解,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • AngularJS $injector 依賴注入詳解

    AngularJS $injector 依賴注入詳解

    這篇文章主要介紹了AngularJS $injector 依賴注入的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • AngularJS基礎(chǔ)知識筆記之過濾器

    AngularJS基礎(chǔ)知識筆記之過濾器

    在我們開發(fā)中經(jīng)常需要在頁面顯示給用戶的信息需要一定處理格式化,才能顯示給用戶。比如時間本地化,或者yyyy-MM-dd HH:mm:ss格式,數(shù)字精度格式化,本地化,人名格式化等等。在angularjs中為我們提供了叫filter的指令,讓我們能夠很輕易就能做到著一些列的功能
    2015-05-05

最新評論

黑山县| 林甸县| 南安市| 莆田市| 会昌县| 阳西县| 依兰县| 安乡县| 开远市| 承德县| 乌海市| 神池县| 三江| 襄樊市| 航空| 门头沟区| 合肥市| 蓝山县| 独山县| 工布江达县| 宁强县| 靖宇县| 甘孜| 水城县| 福州市| 兰州市| 津市市| 鹤壁市| 顺昌县| 库伦旗| 博乐市| 巴塘县| 长乐市| 大竹县| 陇南市| 防城港市| 龙南县| 鄄城县| 五峰| 扬中市| 沅陵县|