Ionic3 表單處理

在項目中彤钟,可以使用angular中的 @angular/forms模塊處理表單,但是并不需要在app.module中引用@angular/forms模塊跷叉,因為在app.module中已經(jīng)引入了@angular/platform-browser模塊逸雹,而在@angular/platform-browser模塊中又導(dǎo)出了 @angular/forms 。也就是說云挟,引入@angular/platform-browser模塊之后就可以直接使用@angular/forms模塊中提供的組件等內(nèi)容梆砸。

使用過程

從@angular/forms中引入需要用到的內(nèi)容

import {FormBuilder, Validators, FormGroup} from '@angular/forms';

對應(yīng)的表單初始化如下:formBuilder.group中的字段就是form表單中對應(yīng)的字段,Validators 用于校驗园欣,規(guī)則根據(jù)實際情況配置帖世。

  constructor(private navCtrl: NavController,
              private navParams: NavParams,
              private formBuilder: FormBuilder,
              private viewCtrl: ViewController,
              private events: Events,
              private httpService: HttpService,
              private storageService: StorageService,
              private nativeService: NativeService) {

    this.loginForm = formBuilder.group({
      username: ['', Validators.compose([Validators.minLength(0), Validators.maxLength(16), Validators.required,])],
      password: ['', Validators.compose([Validators.required, Validators.minLength(0)])]
    });
    this.username = this.loginForm.controls['username'];
    this.password = this.loginForm.controls['password'];
  }

至此,表單初始化完成沸枯,下面是對應(yīng)的 模板代碼

    <ion-row>
      <ion-col>
        <form [formGroup]="loginForm" (ngSubmit)="login(loginForm.value)" novalidate>
          <ion-row>
            <ion-col>
              <ion-list inset class="no-border">
                <ion-item  [class.error]="!username.valid && username.touched">
                  <ion-label fixed>請輸入賬號</ion-label>
                  <ion-input type="text" [formControl]="username" clearInput=true></ion-input>
                </ion-item>
                <!--<div *ngIf="username.hasError('required') && username.touched" class="error-message">*請輸入用戶名</div>-->
                <!--<div *ngIf="(username.hasError('minlength')||username.hasError('maxlength')||username.hasError('pattern')) && username.touched" class="error-message">*請輸入正確的電話號碼</div>-->

                <ion-item>
                  <ion-label fixed>請輸入密碼</ion-label>
                  <ion-input type="password" [formControl]="password" clearInput=true></ion-input>
                </ion-item>
                <!--<div *ngIf="password.hasError('required') && password.touched" class="error-message">*請輸入密碼</div>-->
                <!--<div *ngIf="(password.hasError('minlength')) && password.touched" class="error-message">*密碼長度最少為六位</div>-->

              </ion-list>
            </ion-col>
          </ion-row>

          <ion-row>
            <ion-col>
              <div style="text-align: center">
                <button ion-button round type="submit" class="login-button" [disabled]="!loginForm.valid">測&nbsp;&nbsp;試</button>
              </div>
            </ion-col>
          </ion-row>
        </form>

      </ion-col>
    </ion-row>

對應(yīng)的 表單提交函數(shù)如下

login(value) {
    this.nativeService.showLoading('loading...');
    let password = Md5.hashStr(this.password).toString(),
      params = {
        username: value.username,
        password: value.password,
      };
    this.httpService.login('/oauth/token', params).then(result => {
    //xxx
    }).catch(error => {
    //xxx
    });
  }

ngSubmit 是一個@output屬性日矫,將表單的值以鍵值對的方式組裝成一個對象返回。

自定義檢驗函數(shù)

對以上代碼稍做修改 login.ts

  constructor(private navCtrl: NavController,
              private navParams: NavParams,
              private formBuilder: FormBuilder,
              private viewCtrl: ViewController,
              private events: Events,
              private httpService: HttpService,
              private storageService: StorageService,
              private nativeService: NativeService) {

    this.loginForm = formBuilder.group({
      username: ['', Validators.compose([Validators.minLength(0), Validators.maxLength(16), Validators.required, ])],
      password: ['', Validators.compose([Validators.required, Validators.minLength(0), this.passValidator])]
    });
    this.username = this.loginForm.controls['username'];
    this.password = this.loginForm.controls['password'];
  }

注意上面用到了一個自定義校驗函數(shù) this.passValidator 绑榴,該函數(shù)內(nèi)容如下

  /**
   * 自定義檢驗函數(shù)
   * @param {FormControl} control
   * @returns {{username: {info: string}}}
   */
  passValidator(control: FormControl){
    const value = control.value;
    return value? null : {password: {info: '這是自定義校驗函數(shù)檢查出來的錯誤'}};
  }

為了查看測試結(jié)果哪轿,需要修改一下模板文件 login.html

    <ion-row>
      <ion-col>
        <form [formGroup]="loginForm" (ngSubmit)="login(loginForm.value)" novalidate>
          <ion-row>
            <ion-col>
              <ion-list inset class="no-border">
                <ion-item  [class.error]="!username.valid && username.touched">
                  <ion-label fixed>請輸入賬號</ion-label>
                  <ion-input type="text" [formControl]="username" clearInput=true></ion-input>
                </ion-item>

                <ion-item>
                  <ion-label fixed>請輸入密碼</ion-label>
                  <ion-input type="password" [formControl]="password" clearInput=true></ion-input>
                </ion-item>
                <div *ngIf="password.hasError('required') && password.touched" class="error-message">{{loginForm.getError('password', 'password')?.info}}</div>

              </ion-list>
            </ion-col>
          </ion-row>

          <ion-row>
            <ion-col>
              <div style="text-align: center">
                <button ion-button round type="submit" class="login-button" [disabled]="!loginForm.valid">測&nbsp;&nbsp;試</button>
              </div>
            </ion-col>
          </ion-row>
        </form>

      </ion-col>
    </ion-row>

僅僅是加了 <div *ngIf="password.hasError('required') && password.touched" class="error-message">{{loginForm.getError('password', 'password')?.info}}</div> 
當(dāng)校驗不通過的時候,就會在這個div上顯示 在 login.ts 中定義的 提示信息翔怎。

以下是測試結(jié)果窃诉,仔細看


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末杨耙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子飘痛,更是在濱河造成了極大的恐慌珊膜,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宣脉,死亡現(xiàn)場離奇詭異车柠,居然都是意外死亡,警方通過查閱死者的電腦和手機塑猖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門竹祷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人萌庆,你說我怎么就攤上這事”揖桑” “怎么了践险?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吹菱。 經(jīng)常有香客問我巍虫,道長,這世上最難降的妖魔是什么鳍刷? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任占遥,我火速辦了婚禮,結(jié)果婚禮上输瓜,老公的妹妹穿的比我還像新娘瓦胎。我一直安慰自己,他們只是感情好尤揣,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布搔啊。 她就那樣靜靜地躺著,像睡著了一般北戏。 火紅的嫁衣襯著肌膚如雪负芋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天嗜愈,我揣著相機與錄音旧蛾,去河邊找鬼。 笑死蠕嫁,一個胖子當(dāng)著我的面吹牛锨天,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播剃毒,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼绍绘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起陪拘,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤厂镇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后左刽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捺信,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年欠痴,在試婚紗的時候發(fā)現(xiàn)自己被綠了迄靠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡喇辽,死狀恐怖掌挚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情菩咨,我是刑警寧澤吠式,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站抽米,受9級特大地震影響特占,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜云茸,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一是目、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧标捺,春花似錦懊纳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至萍倡,卻和暖如春身弊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背列敲。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工阱佛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人戴而。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓凑术,卻偏偏與公主長得像,于是被迫代替她去往敵國和親所意。 傳聞我的和親對象是個殘疾皇子淮逊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 22年12月更新:個人網(wǎng)站關(guān)停催首,如果仍舊對舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,180評論 22 257
  • 預(yù) (ahead-of-time, AoT) 編譯 在打包項目的時候提前編譯好應(yīng)用,打包好之后可以直接啟動泄鹏,而不是...
    莫莫莫I閱讀 607評論 0 8
  • angular提供了模板驅(qū)動和模型驅(qū)動兩種方式來構(gòu)建表單郎任。模板驅(qū)動模式使用模板表單內(nèi)置指令、內(nèi)置校驗的方式來構(gòu)建表...
    oWSQo閱讀 871評論 0 0
  • 版本:Angular 5.0.0-alpha 表單是商業(yè)應(yīng)用的支柱备籽,我們用它來執(zhí)行登錄舶治、求助、下單车猬、預(yù)訂機票霉猛、安排...
    soojade閱讀 1,276評論 0 1
  • 熟識的人都叫他們儺送和翠翠,這并不是歷史的巧合珠闰,只是巧合的是他們都是鳳凰古城也就是“邊城”的人惜浅,二人呢,也自是青梅...
    春風(fēng)巷72號閱讀 723評論 10 5