来扯点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的使用—以登录和注销为例

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • 本系列文集:来扯点ionic3 表单几乎是每一个应用程序中必不可少的一部分,在各类 HTML 教材中,表单也经常被...
    忠叔阅读 7,648评论 5 20
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,612评论 4 59
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,293评论 18 399
  • React中没有类似Angular那样的双向数据绑定,在做一些表单复杂的后台类页面时,监听、赋值、传递、校验时编码...
    tedyuen777阅读 9,781评论 1 23