來扯點ionic3[6] 繼續上手表單:魔法般的雙向數據綁定

本系列文集:來扯點ionic3

相關章節:來扯點ionic3[5] 輕松上手表單:這些組件可以玩一年

當我們有了一個表單,要如何處理表單中的數據?

回顧前端技術的發展,最早我們通過 form 的形式,將表單直接 get/post 給服務器,后來有了 ajax 技術,我們提取出表單中的數據,在不刷新頁面的情況下就能與服務器進行交互。

假設頁面上有一個 id 為 username 的表單,腳本中有一個名為 username 的全局變量,怎么讓將二者綁定起來。

document.getElementById('username').value=username;
username=document.getElementById('username').value;

在傳統的網頁中,我們通過不斷觸發調用這兩條語句中,而讓視圖中的值和業務腳本中的值保持一致。

在很多時候,我們希望模型和視圖是始終同步的:當模型發生變化,就會觸發視圖發生變化;當視圖被更新,也會觸發模型的更新。這一些的實現歸功于Angular中一個重要的特性:雙向綁定。

表單數據雙向綁定

此時我們的組件中,有這樣的一個成員name:

export class HomePage {

    name:string="Tony Stark";
    ...

  }

我們把模板中已經準備好的 input 組件通過指令和 name 進行雙向綁定。

<ion-list>
    <ion-item>
      <ion-label fixed>Name</ion-label>
      <ion-input type="text" [(ngModel)]="name"></ion-input>
    </ion-item>
  </ion-list>

其中 [(ngModel)] 就是將表單和頁面組件綁定在一起的橋梁,當一個表單被綁定到某個屬性成員上時,它的value就自然等于這個屬性的值。


那么,當用戶改變了表單里的值,屬性成員是否會像我們預期的那樣發生改變呢?我將 name 這一屬性通過模板語法 {{name}} 輸出到了頁面上,下面的動圖展示了表單更新時屬性成員的表現:


動圖:Input 雙向綁定

一切就這么簡單,這就意味著未來我們在開發表單的時候,只要將表單和變量進行綁定,它們之間的同步可以完全交給框架來做,我們最后只需要處理組件中的這些數據,而不需要再編寫代碼與表單進行交互。

綁定一個對象的成員

對于像這樣的一個對象

obj:any={
    id:100
}

可以這樣綁定

 <ion-input type="text" [(ngModel)]="obj.id"></ion-input>

Radio 的綁定

對于Radio空間,[(ngModel)]并非直接加在 ion-radio 標簽上,而是加在綁定了 ion-radio-group 指令的 ion-list 標簽上。

  <ion-list radio-group [(ngModel)]="gender">
    <ion-list-header>請選擇性別</ion-list-header>
    <ion-item>
      <ion-label fixed>我是男生</ion-label>
      <ion-radio value="男"></ion-radio>
    </ion-item>
    <ion-item>
      <ion-label fixed>我是女生</ion-label>
      <ion-radio value="女"></ion-radio>
    </ion-item>
  </ion-list>

框架會匹配模型的值和 group 中每個 radio 的value,相等的 radio 會默認選中,比如這個例子中 gender 在聲明時就被賦值為 "女"。

gender:string="女";
動圖:Radio 雙向綁定

Toggle 的綁定

Toggle 組件應該綁定一個布爾變量。



Select 的綁定

Select 組件應將數據綁定在 ion-select 標簽上,注意當 multiple="true" 是,select的值應該是一個數組。

hobbies:string[]=['足球','電影'];
<ion-list>
    <ion-item>
      <ion-label>興趣愛好[圖片上傳中...(7.3.gif-46356f-1511168830451-0)]
</ion-label>
      <ion-select multiple="true" [(ngModel)]="hobbies">
        <ion-option value="足球">足球</ion-option>
        <ion-option value="籃球">籃球</ion-option>
        <ion-option value="閱讀">閱讀</ion-option>
        <ion-option value="電影">電影</ion-option>
        <ion-option value="旅行">旅行</ion-option>
      </ion-select>
    </ion-item>
  </ion-list>
動圖: Select 多選模式下的數據綁定

Range的綁定

Range 應該綁定一個 number 型變量,或者一個可以通過 parseInt 轉換成 number 的字符串。

這兩種都是可以使用的:

age:number=30;
age:string="30";

這種情況也不會出錯:

age:string="30歲";

但是這種就可能引發 NaN 的錯誤:

age:string="thirty";

如果為 range 添加了 dualKnobs="true" 的屬性(雙滑塊),則需要綁定一個包含 lower 和 upper 兩個成員的對象。

age:object={
    lower:25,
    upper:35
}
動圖:雙滑塊 Range 的數據綁定

Datetime 的綁定

Datetime 組件綁定一個字符串。但是這個字符串的格式是什么樣的呢?如果這個字符串的 displayFormat 是 "YYYY-MM-DD" ,那么字符串也需要使用一致的格式嗎?

我們可以讓字符串默認為空置,通過更改表單先輸出一個值。


似乎符合預期,這時把 displayFormat 改為中文的形式:


這時我們發現,datetime組件的值并不和我們看到的格式保持一致,那的格式是基于什么樣的標準呢?實際上它采用了 ISO 8601 的日期格式標準,它是這樣子的:

2017
2017-11
2017-11-20
2017-11-20T17:30
2017-11-20T17:30:55Z
17:30
17:55

也就是說,在單純只有日期或時間的情況下,和我們熟悉的 YYYY-MM-DD HH:mm:ss 的格式是一致的,但是同時存在日期和時間的情況下,就要注意它的寫法了。

所以說,不論 displayFormat 的格式是什么,最后我們拿到都是這種格式的字符串,你可以直接以這樣一個格式和服務器進行交互。但是如果你的數據庫采用了的這一字段采用了 datetime 格式,則需要進行一個轉換。

提供參考的文檔

  1. 官方文檔:Datetime
  2. Date and Time Formats

下一章:來扯點ionic3[7] LocalStorage的使用—以登錄和注銷為例

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 本系列文集:來扯點ionic3 表單幾乎是每一個應用程序中必不可少的一部分,在各類 HTML 教材中,表單也經常被...
    忠叔閱讀 7,760評論 5 20
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,229評論 4 61
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • React中沒有類似Angular那樣的雙向數據綁定,在做一些表單復雜的后臺類頁面時,監聽、賦值、傳遞、校驗時編碼...
    tedyuen777閱讀 9,896評論 1 23