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

關(guān)于angular表單動態(tài)驗證的一種新思路分享

 更新時間:2022年03月24日 10:36:10   作者:myskies  
在Angular?中不管是模板驅(qū)動表單還是響應式表單,對于動態(tài)創(chuàng)建表單的支持都很好,下面這篇文章主要給大家介紹了關(guān)于angular表單動態(tài)驗證的一種新思路,需要的朋友可以參考下

引言

在項目中,我們有時候往往需要動表單的驗證做動態(tài)的規(guī)劃。比如在一個注冊界面中同步注冊兩種用戶,但兩種用戶的輸入項卻不是相同的。

教師的話,要求輸入工號:

學生用戶的話,則要求輸入學號:

我們把這種情景,稱為動態(tài)的表單驗證。

在上述表中校驗中,我們要求:

  • 工號與學號互不干擾。
  • 選擇教師類型時,只判斷工號是否已經(jīng)輸入。
  • 選擇學生類型時,則只判斷學號是否已經(jīng)輸入。

實現(xiàn)方案

其實這個實現(xiàn)的方案有很多種。在項目中我們已經(jīng)使用過的大體有三種:

  • 使用跨字段驗證器。
  • 訂閱用戶類型,將用戶類型發(fā)生變化時,重置工號或?qū)W號的驗證規(guī)則。
  • 訂閱用戶類型,將用戶類型發(fā)生變化時,在fromGroup中添加或移除工號,學號FromControl。

跨字段驗證器

Anguar的官方給出在在跨字段驗證器的使用示例,該思想是在FromGroup上添加一個驗證器,然后在該驗證器中獲取FormControl的值,在根據(jù)具體的情況來進行驗證。

優(yōu)點:

  • 官方示例,學習成本低。
  • 直接將驗證放到了驗證器中,邏輯清晰。
  • 驗證器不會對獲取FromGroup的值產(chǎn)生影響。

缺點:

  • 無法在FormControl直接定義驗證條件,不直觀。
  • 只能統(tǒng)一顯示錯誤信息,無法為單一的字段定制錯誤信息。

你可以點擊https://segmentfault.com/a/1190000041563611來查看實現(xiàn)樣例。

重置驗證規(guī)則

FromControl提供了clearValidators()來清空驗證器,以及setValidators()來設(shè)置驗證器,所以我們可以訂閱用戶類型是否發(fā)生變化,在發(fā)生變化時,根據(jù)情況清空交叉字段的驗證器,然后再重新對其驗證器進行設(shè)置。

優(yōu)點:

  • 為動態(tài)地添加異步驗證器提供了一種新的思路

缺點:

  • 驗證規(guī)則不直觀。
  • 代碼量大。

重置FromGroup項

FromGroup提供的removeControl()使得我們可以移除其中的FormControl,利用該機制我們可以訂閱用戶類型發(fā)生變化后,根據(jù)情況來移除、添加相應的FormControl,從而達到動態(tài)驗證表單的目的。

示例代碼 C 層:

export class AppComponent implements OnInit {
  name = 'Angular ' + VERSION.major;
  formGroup = new FormGroup({});
  // 學號
  studentNoFormControl = new FormControl(null, Validators.required);
  // 工號
  teachterNoFormControl = new FormControl(null, Validators.required);
  // 用戶類型
  typeFormControl = new FormControl(null, Validators.required);
  ngOnInit(): void {
    this.formGroup.addControl('name', new FormControl('', Validators.required));
    this.formGroup.addControl('type', this.typeFormControl);

    // 訂閱類型的變化,從而決定在formGroup中添加學號還是工號FormControl
    this.typeFormControl.valueChanges.subscribe((type) => {
      if (type === 0) {
        this.formGroup.removeControl('studentNo');
        this.formGroup.addControl('teacherNo', this.teachterNoFormControl);
      } else {
        this.formGroup.removeControl('teacherNo');
        this.formGroup.addControl('studentNo', this.studentNoFormControl);
      }
    });

    // 初始化用戶類型為教師
    this.typeFormControl.setValue(0);
  }

  onSubmit(): void {
    alert('submit');
  }

  /**
   * 顯示學號或是工號的input
   */
  showStudent(): boolean {
    return this.typeFormControl.value === 1;
  }
}

V 層:

<hello name="{{ name }}"></hello>
<p>表單動態(tài)驗證示例</p>
<pre>{{ formGroup.invalid | json }}</pre>
<pre>{{ formGroup.get('type').value | json }}</pre>
<form [formGroup]="formGroup">
  <div>姓名:<input type="text" formControlName="name" /></div>
  <div>
    用戶類型:
    <label
      ><input type="radio" [value]="0" formControlName="type" name="type" />
      教師</label
    >
    <label
      ><input type="radio" [value]="1" formControlName="type" name="type" />
      學生</label
    >
  </div>
  <div *ngIf="showStudent()">
    學號:<input type="text" formControlName="studentNo" />
  </div>
  <div *ngIf="!showStudent()">
    工號:<input type="text" formControlName="teacherNo" />
  </div>
  <button [disabled]="formGroup.invalid" (click)="onSubmit()">Submit</button>
</form>

優(yōu)點:

  • 直接在FormControl上設(shè)置驗證器,代碼直觀。
  • 可以直接使用angular提供的ngvalid等class屬性,快速定義校驗結(jié)果的樣式。

缺點:

  • 驗證器會對獲取FromGroup的值產(chǎn)生影響。比如在后續(xù)對FormGroup獲取相關(guān)的值的操作中,需要對FormGroup是否有值來進行判斷,容易產(chǎn)生在undefined上調(diào)用value的錯誤。(這可以使用?來規(guī)避 ---- formGroup.get('xxx')?.value。

本文demo地址:源碼最終效果

總結(jié)

到此這篇關(guān)于angular表單動態(tài)驗證的一種新思路的文章就介紹到這了,更多相關(guān)angular表單動態(tài)驗證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解基于Bootstrap+angular的一個豆瓣電影app

    詳解基于Bootstrap+angular的一個豆瓣電影app

    本篇文章主要介紹了基于Bootstrap+angular的一個豆瓣電影app ,非常具有實用價值,需要的朋友可以參考下
    2017-06-06
  • Angular實現(xiàn)可刪除并計算總金額的購物車功能示例

    Angular實現(xiàn)可刪除并計算總金額的購物車功能示例

    這篇文章主要介紹了Angular實現(xiàn)可刪除并計算總金額的購物車功能,涉及AngularJS事件響應、元素遍歷與數(shù)值運算等相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12
  • AngularJS基礎(chǔ)學習筆記之控制器

    AngularJS基礎(chǔ)學習筆記之控制器

    在AngularJS中,控制器是一個Javascript函數(shù)(類型/類),用來增強除了根作用域意外的作用域?qū)嵗?。當你或者AngularJS本身通過<code>scope.$new</code>倆創(chuàng)建一個新的子作用域?qū)ο髸r,有一個選項能讓你將它當做參數(shù)傳遞給控制器。
    2015-05-05
  • Angularjs按需查詢實例代碼

    Angularjs按需查詢實例代碼

    這篇文章主要介紹了Angularjs按需查詢實例代碼,需要的朋友可以參考下
    2017-10-10
  • AngularJS實踐之使用ng-repeat中$index的注意點

    AngularJS實踐之使用ng-repeat中$index的注意點

    最近通過客戶的投訴主要到在ng-repeat中使用了$index引發(fā)的一個bug,下面一起來看看這個錯誤是如何引發(fā)的, 以及如何避免這種bug產(chǎn)生,然后說說我們從中得到的經(jīng)驗和教訓。有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • AngularJS基礎(chǔ) ng-hide 指令用法及示例代碼

    AngularJS基礎(chǔ) ng-hide 指令用法及示例代碼

    本文主要介紹AngularJS ng-hide 指令,這里整理了ng-hide指令的基礎(chǔ)資料,并附實例代碼,有興趣的小伙伴參考下
    2016-08-08
  • Angular 封裝并發(fā)布組件的方法示例

    Angular 封裝并發(fā)布組件的方法示例

    本篇文章主要介紹了Angular 封裝并發(fā)布組件的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • AngularJS實現(xiàn)進度條功能示例

    AngularJS實現(xiàn)進度條功能示例

    這篇文章主要介紹了AngularJS實現(xiàn)進度條功能,結(jié)合具體完整實例形式分析了AngularJS實現(xiàn)進度條功能的原理、相關(guān)知識點與注意事項,需要的朋友可以參考下
    2017-07-07
  • AngularJS動態(tài)加載模塊和依賴的方法分析

    AngularJS動態(tài)加載模塊和依賴的方法分析

    這篇文章主要介紹了AngularJS動態(tài)加載模塊和依賴的方法,結(jié)合實例形式分析了AngularJS使用ocLazyLoad實現(xiàn)動態(tài)加載的相關(guān)操作技巧,需要的朋友可以參考下
    2016-11-11
  • AngularJS壓縮JS技巧分析

    AngularJS壓縮JS技巧分析

    這篇文章主要介紹了AngularJS壓縮JS的操作技巧,分析了AngularJS進行壓縮(minify)之后出現(xiàn)的問題與相應的解決方法,需要的朋友可以參考下
    2016-11-11

最新評論

老河口市| 无锡市| 泾川县| 剑河县| 民丰县| 武冈市| 孝昌县| 兴安盟| 保靖县| 聂荣县| 永登县| 精河县| 玛多县| 仙居县| 九寨沟县| 改则县| 成安县| 曲周县| 崇礼县| 忻州市| 临沂市| 剑河县| 栾川县| 电白县| 拉萨市| 年辖:市辖区| 进贤县| 四子王旗| 灯塔市| 齐齐哈尔市| 台山市| 阿拉善左旗| 搜索| 曲阳县| 新沂市| 贵州省| 东海县| 巴青县| 浙江省| 乡城县| 化德县|