亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

angular異步驗(yàn)證防抖踩坑實(shí)錄

 更新時(shí)間:2019年12月01日 14:53:07   作者:笙歌會(huì)停  
這篇文章主要給大家介紹了關(guān)于angular異步驗(yàn)證防抖踩坑的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用angular具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

本周的一個(gè)需求是在一個(gè)異步驗(yàn)證上加上防抖,防抖,以前也接觸過,依稀記得不難,就沒再去看angluar的官方文檔,直接就開始google寫了,然后……一不小心就掉坑里了。

突然沒了效果的驗(yàn)證功能

在網(wǎng)上一番查詢以后,選了一個(gè)最簡(jiǎn)單,最符合的實(shí)現(xiàn)

一番修改以后我的代碼成了下面這樣

 public oldPasswordValidator(): AsyncValidatorFn {
  return (ctrl: AbstractControl): Promise<ValidationErrors | null> | Observable<ValidationErrors | null> => {
  rerutn ctrl.valueChanges.pipe(
    debounceTime(2000),
    distinctUntilChanged(),
    switchMap(value => this.checkPasswordIsRight(value)),
    map((isRight: boolean) => (isRight ? null : {passwordError: true})),
    catchError(() => null));
  };

但是驗(yàn)證器并沒有效果,在c層獲取到的始終是null,而在方法中打印結(jié)果,卻可以發(fā)現(xiàn),能夠產(chǎn)生正確的結(jié)果

但是獲取到的相關(guān)錯(cuò)誤一直是沒有,更讓我感到驚訝的是表單的valid和invalid竟然同時(shí)處在了false,他們不是應(yīng)該互斥嗎?不是反義詞嗎?

FormControl的status

首先還是解決valid與invalid的疑惑吧,查詢官方文檔。

FormControl的status繼承自AbstractControl

AbstractControl是 FormControl、FormGroup 和 FormArray 的基類。它提供了一些所有控件和控件組共有的行為,比如運(yùn)行驗(yàn)證器、計(jì)算狀態(tài)和重置狀態(tài)。 它還定義了一些所有子類共享的屬性,如 value、valid 和 dirty。不允許直接實(shí)例化它。

找到valid

至此,這個(gè)疑問解決了,互斥的并不僅僅是valid和invalid,

還有一個(gè)檢查進(jìn)行狀態(tài):pending和禁止disable,驗(yàn)證一下,果然此時(shí)的狀態(tài)是在pending

為何會(huì)一直在pending狀態(tài)?

接著查看表單驗(yàn)證的官方文檔

自定義異步驗(yàn)證器和同步驗(yàn)證器很像,只是它們必須返回一個(gè)稍后會(huì)輸出 null 或“驗(yàn)證錯(cuò)誤對(duì)象”的承諾(Promise)或可觀察對(duì)象,如果是可觀察對(duì)象,那么它必須在某個(gè)時(shí)間點(diǎn)被完成(complete),那時(shí)候這個(gè)表單就會(huì)使用它輸出的最后一個(gè)值作為驗(yàn)證結(jié)果。(譯注:HTTP 服務(wù)是自動(dòng)完成的,但是某些自定義的可觀察對(duì)象可能需要手動(dòng)調(diào)用 complete 方法)
返回的可觀察對(duì)象必須是有限的,也就是說(shuō),它必須在某個(gè)時(shí)間點(diǎn)結(jié)束(complete)。要把無(wú)盡的可觀察對(duì)象轉(zhuǎn)換成有限的,可以使用 first、last、take 或 takeUntil 等過濾型管道對(duì)其進(jìn)行處理。

結(jié)果很明顯了,上面的觀察者對(duì)象是通過valueChangs產(chǎn)生的, 被人訂閱后,并不會(huì)主動(dòng)的調(diào)用complete()方法,而會(huì)不停的發(fā)布新值。下面的例子可以看出來(lái)

給他加個(gè)first()讓他只返回第一個(gè)結(jié)果,果然好使了:

first(predicate: function(value: T, index: number, source: Observable<T>): boolean, resultSelector:function(value: T, index: number): R, defaultValue: R): Observable<T | R>
只發(fā)出由源 Observable 所發(fā)出的值中第一個(gè)(或第一個(gè)滿足條件的值)。

如果你足夠細(xì)心

看的太不仔細(xì)了,到解決這個(gè)問題之前,一直都沒發(fā)現(xiàn)……

一個(gè)更簡(jiǎn)單的實(shí)現(xiàn)方式

驗(yàn)證的防抖功能實(shí)際上并不需要通過上面的方式實(shí)現(xiàn),盡管上面也并不困難。

最簡(jiǎn)單的防抖方式,在官方文檔已經(jīng)提供了:

默認(rèn)情況下,每當(dāng)表單值變化之后,都會(huì)執(zhí)行所有驗(yàn)證器。對(duì)于同步驗(yàn)證器,沒有什么會(huì)顯著影響應(yīng)用性能的地方。不過,異步驗(yàn)證器通常會(huì)執(zhí)行某種 HTTP 請(qǐng)求來(lái)對(duì)控件進(jìn)行驗(yàn)證。如果在每次按鍵之后都發(fā)出 HTTP 請(qǐng)求會(huì)給后端 API 帶來(lái)沉重的負(fù)擔(dān),應(yīng)該盡量避免。

我們可以把updateOn屬性從change(默認(rèn)值)改成submit或blur來(lái)推遲表單驗(yàn)證的更新時(shí)機(jī)。

 /**
  * 初始化表單
  */
 initForm() {
  this.modifyPasswordForm = this.fb.group({
    oldPassword: [null, [Validators.required], [this.userService.oldPasswordValidator()]],
    newPassword: [null, Validators.required],
    confirmNewPassword: [null, Validators.required]

    // updateOn 作用是在什么時(shí)候更新表單數(shù)據(jù)
    // https://angular.cn/guide/form-validation#note-on-performance
   }, {updateOn: 'blur'},
  );
 }

想了解更多updateOn的內(nèi)容,可查看這篇文章。

總結(jié)

這次的問題可以完全說(shuō)出在了看文檔不仔細(xì),神奇的是看了幾遍那個(gè)StackOverflow上的回答都沒發(fā)現(xiàn)他比我多了一個(gè)first(),雖然因此浪費(fèi)了不少的時(shí)間,但收獲也是巨大的,這波不虧。

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • AngularJS+Node.js實(shí)現(xiàn)在線聊天室

    AngularJS+Node.js實(shí)現(xiàn)在線聊天室

    隨著互聯(lián)網(wǎng)和信息技術(shù)的發(fā)展,如何快速構(gòu)建高效、強(qiáng)大的動(dòng)態(tài)網(wǎng)站成為很多人研究的熱點(diǎn)。該文將結(jié)合AngularJS和Node.js構(gòu)建一個(gè)在線聊天室,體現(xiàn)AngularJs和Node.js整合的優(yōu)點(diǎn)。
    2015-08-08
  • 深入理解AngularJS中的ng-bind-html指令和$sce服務(wù)

    深入理解AngularJS中的ng-bind-html指令和$sce服務(wù)

    這篇文章給大家詳細(xì)介紹了AngularJS中的ng-bind-html指令和$sce服務(wù),對(duì)大家學(xué)習(xí)AngularJS具有一定參考借鑒價(jià)值,有需要都可以參考學(xué)習(xí)。
    2016-09-09
  • Angular處理未可知異常錯(cuò)誤的方法詳解

    Angular處理未可知異常錯(cuò)誤的方法詳解

    這篇文章主要給大家介紹了關(guān)于Angular如何處理未可知異常錯(cuò)誤的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Angular腳手架開發(fā)的實(shí)現(xiàn)步驟

    Angular腳手架開發(fā)的實(shí)現(xiàn)步驟

    這篇文章主要介紹了Angular腳手架開發(fā)的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Angular7實(shí)現(xiàn)拖放Drag?Drop示例詳解

    Angular7實(shí)現(xiàn)拖放Drag?Drop示例詳解

    這篇文章主要介紹了Angular7實(shí)現(xiàn)拖放Drag?Drop示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Angular模板表單校驗(yàn)方法詳解

    Angular模板表單校驗(yàn)方法詳解

    這篇文章主要為大家詳細(xì)介紹了Angular模板表單校驗(yàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 舉例講解AngularJS中的模塊

    舉例講解AngularJS中的模塊

    這篇文章主要介紹了AngularJS中的模塊,文中講到了其應(yīng)用模塊和控制器模塊的例子,需要的朋友可以參考下
    2015-06-06
  • 深入淺析AngularJS和DataModel

    深入淺析AngularJS和DataModel

    這篇文章主要介紹了深入淺析AngularJS和DataModel 的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • Angular.js中ng-include用法及多標(biāo)簽頁(yè)面的實(shí)現(xiàn)方式詳解

    Angular.js中ng-include用法及多標(biāo)簽頁(yè)面的實(shí)現(xiàn)方式詳解

    這篇文章主要給大家介紹了在Angular.js中ng-include用法及多標(biāo)簽頁(yè)面的實(shí)現(xiàn)方式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),相信對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。
    2017-05-05
  • 解決angular的$http.post()提交數(shù)據(jù)時(shí)后臺(tái)接收不到參數(shù)值問題的方法

    解決angular的$http.post()提交數(shù)據(jù)時(shí)后臺(tái)接收不到參數(shù)值問題的方法

    這篇文章為大家分享了解決angular的$http.post()提交數(shù)據(jù)時(shí)后臺(tái)接收不到參數(shù)值問題的方法,感興趣的小伙伴們可以參考一下
    2015-12-12

最新評(píng)論