[Ionic 2从入门到精通] 2.6 模板

模板,个人认为是Ionic 2中最有趣的东西。也是框架能力厉害的地方。看看下面的代码:

<ion-header>
    <ion-navbar color="secondary">
        <ion-title>
            My Friends
        </ion-title>
        <ion-buttons end>
        <button ion-button icon-only (click)="doSomethingCool()"><ion-icon name="add-circle"></ion-icon></button>
        </ion-buttons>
    </ion-navbar>
</ion-header>
<ion-content>
    <ion-searchbar (input)="getItems($event)"></ion-searchbar>
    <ion-list>
        <ion-item *ngFor="let item of items">
            <ion-avatar item-left>
            <img [src]="item.picture">
            </ion-avatar>
            <h2>{{item.name}}</h2>
            <p>{{item.description}}</p>
        </ion-item>
    </ion-list>
</ion-content>

上面代码在没有额外样式的情况下,看起来将会是这样的:


1.6.1.jpg

看起来没那么惊艳,但是我们就已经用简单的几行代码设置好了一个复杂的布局,加点自定义样式的话,我们就可以得到一个非常时尚的界面了。稍后我们会从各个方面彻底的了解在Ionic 2中创建模板,但是目前我需要给你找找一个完整的页面模板看起来是什么感觉,以及使用Ionic提供的组件是多么的简单。

Ionic 2中的模板语法有很多知识需要学习,如果你之前有使用过Ionic 1的话,你会发现他有一些重大的变更 —— 所以我们需要具体的学习一下模板。

此后也会涉及到其他的一些知识,但是这个是我认为这开始使用Ionic 2之前最后学要学习的‘核心’知识 —— 一旦你拿下了类和模板,那么你就可以直接可以开始制作一些东西。所以,我们先转入一些基础理论知识的学习,然后在做学一些练习示例吧。

语法

可能是Ionic 2里面最让人困惑的语法之一了。你会经常遇到一些这样的代码:

<ion-item *ngFor="let item of items">

或者

<p *ngIf="someBoolean"><p>

诸如此类。在Angular 2中 * 语法用与创建一个嵌入模板的快捷方式,所以,当我们使用 *ngIf的时候,上面的代码展开来就是:

<template [ngIf]="someBoolean">
    <p></p>
</template>

使用模板的原因是Angular 2将模板看作是DOM块,这样一来就可以动态操作他了。所以,在上面的 *ngIf 范例中我们不会只按照字面意思将他渲染到DOM,

<p *ngIf="someBoolean"></p>

如果 someBoolean 等于true的话,会显示:

<p></p>

false的话就不显示。同理,当我们使用 *ngFor的时候,我们不只是按照字面上去渲染:

<p *ngFor="let item of items">{{item.name}}</p>

我们会针对每个条目分别以段落的方式渲染出来:

<p>Bananas</p>
<p>More Bananas</p>
<p>Pancakes</p>

要使用这个功能的话,我们需要使用<template>,但是手动写这些模板又很繁琐,所以 * 语法是用来简化这些繁琐的操作的。
解释得这么清楚了,我们来具体的看看想 *ngIf 和 *ngFor 这样的指令的使用方法。

循环

很多时候你会循环大量的数据 —— 例如当你有一个文章列表你想要将所有文章的标题渲染到一个列表。我们就可以用Angular 2 提供的ngFor指令来完成这个任务了 -- 看起来大概是这样的:

<ion-list>
    <ion-item *ngFor="let article of articles" (click)="viewArticle(article)">
        {{article.title}}
    </ion-item>
</ion-list>

上面的例子中,我们创建了一个<ion-list>,然后对于articles数组里面的每个article我们都添加了一个<ion-item>。在之前的基础部分我讲过了使用let来创建一个局部变量,我们这里就用到了。他允许我们访问我们当前循环到的article,我们使用这个变量来获取他的标题然后在列表上渲染出来,同时,在用户点击的时候将他传入到viewArticle函数中。
通过将当前article的引用传入到viewArticle函数,我们可以用来做类似弹出文章新页面的操作。

条件

有时候你想着符合特定条件的情况下展示模板特定的部分,可以使用一些方法来做到:

<div *ngIf="someBoolean">

ngIf的表达式值为true的时候,那么他附加到的节点才会被渲染出来。在本例中,只有在someBoolean为true的时候,才会被添加到DOM,反之则不会。
ngIf在布尔场景(true和false)下非常厉害,但是有时候你需要根据大量不同的值来处理。这种情况下就得使用ngSwitch

<div [ngSwitch]="paragraphNumber">
    <p *ngSwitchCase="1">Paragraph 1</p>
    <p *ngSwitchCase="2">Paragraph 2</p>
    <p *ngSwitchCase="3">Paragraph 3</p>
    <p *ngSwitchDefault>Paragraph</p>
</div>

在这个例子中,我们使用ngSwitch来检查paragraphNumber的值。哪个ngSwitchCase语句匹配到了这个值,就会是以哪个作为DOM元素去渲染,如果没有匹配上的值,那么就用ngSwitchDefault元素。
还可以通过hidden属性去根据条件去显示或者隐藏一个元素。
例如:

<ion-avatar [hidden]="hideAvatar" item-left>

在这个例子中,当hideAvatartrue的时候,这个元素将会隐藏,当为false的时候则显示。使用这个方法的时候,你的类定义里面应该有this.hideAvatar变量存在,你可以通过给这个变量赋值来控制元素的显示和隐藏。
不但可以根据条件显示整个元素,还可以根据条件给元素添加不同的类,例如:

<ion-avatar [class.my-class]="showMyClass" item-left>

这个跟上面的[hidden]方法类似,但是他不是根据条件显示和隐藏元素,他根据条件来添加CSS里面定义好的类。这个方法非常实用,例如,当你想要用来区分列表里面已读和未读信息的时候。

Ionic 2 模板组件

目前为止谈到的基本上都是Angular 2的东西,没有Ionic特有的(除了模板里用的<ion-list><ion-item>之外)。这些语法和一些Ionic特有组件将在你的模板里贯穿始终。我们现在要学习一些Ionic特有的东西了,先从Ionic 2页面模板的基本布局开始:

<ion-header>
    <ion-navbar>
        <ion-title>
            Home
        </ion-title>
    </ion-navbar>
</ion-header>

<ion-content class="home">
    <ion-card>
        <ion-card-header>
            Card Header
        </ion-card-header>
        <ion-card-content>
            Hello World
        </ion-card-content>
    </ion-card>
</ion-content>

这个是你使用blank布局自动生成的模板代码。这里有两个很重要的组件,基本每个模板都会出现的:<ion-navbar><ion-content>
<ion-content>元素只是简单的用来包含页面的主要内容(本案例中的‘卡片’),并允许滚动。注意,他有个名为‘home’的类,如果你查看home.scss文件的时候,你会发现里面有‘home’的类定义。他没做什么特别的事情,他只是一个约定,允许你对<ion-content>的样式单独进行变更(记住,即使你只是在home.scss里添加了样式,这样新样式还是会应用到整个项目的,文件分离只是为了架构而已)。
两者之间更为有趣的是<ion-navbar>。这个是用来添加页首的,里面可以添加页标题,以及左右按钮。虽然这可以不大符合审美,他还有很多内置的导航智能。如果你是压入 push一个新页面(后面会涉及),那么<ion-navbar>里面会自动出现一个返回按钮允许用户返回之前页面,而不用你手动去添加。
上面部分包含的基本模板语法在Ionic 2页面中会经常见到,其他需要做的就是拖入和配置Ionic 2提供的大量组件(如果你喜欢冒险,那么自建组件)。
现在我们看一下如何在模板中实现一些Ionic组件。我们不会全部组件都讲到,因为它们是在是太多了,我们只是来尝尝鲜。完整的组件列表,可以在Ionic 2文档中查阅。

列表 List

列表上移动应用中使用最广泛的组件之一。在本地应用上滑动那种丝滑的感觉,那种顺滑的加速和减速,感觉起来真的是爽呆了 -- 这种感觉很难复制。幸运的是,你不用担心这个,Ionic 2为了解决了所有的难点,下面这样就可以简单地使用列表了:

<ion-list>
    <ion-item>Item 1</ion-item>
    <ion-item>Item 2</ion-item>
    <ion-item>Item 3</ion-item>
</ion-list>

或者如果你想要根据类定义里面的一系列数据来动态窗台你的列表:

<ion-list>
    <ion-item *ngFor="let item of items" (click)="itemSelected(item)">
        {{item.title}}
    </ion-item>
</ion-list>

滑块 Slide

滑块是另一个移动应用的通用组件之一,滑块看起来是这样的:


1.6.2.jpg

在你有大量的图片或者页面想要通过用户左右滑动来展示的情况下,滑块就可以上场了。与列表一样,使用滑块也非常简单:

<ion-slides [options]="slideOptions">
    <ion-slide>
        <h2>Slide 1</h2>
    </ion-slide>

    <ion-slide>
        <h2>Slide 2</h2>
    </ion-slide>

    <ion-slide>
        <h2>Slide 3</h2>
    </ion-slide>
</ion-slides>

这里用到了一个<ion-slides>容器,然后每个单独的滑块都分别使用<ion-slide>来定义。也可以提供一些选项来定义滑块的行为;例如是否循环是否分页。(后续会有完整示例)

输入 Input

Ionic 2中使用<ion-input>来代码<input>。跟普通的<input>一样,可以根据你想要获得的信息来给他指定类型,使用Ionic版的输入框可以享受Ionic为移动做的自定义设计的好处。

<ion-list>

    <ion-item>
        <ion-label fixed>Username</ion-label>
        <ion-input type="text" value=""></ion-input>
    </ion-item>

    <ion-item>
        <ion-label fixed>Password</ion-label>
        <ion-input type="password"></ion-input>
    </ion-item>

</ion-list>

就跟定制的<ion-input>一样,Ionic提供了其他输入自定义的输入组件,如<ion-select><ion-radio><ion-checkbox>以及<ion-toggle>

格子 Grid

Grid组件非常强大,可以用来创建复杂的布局。如果你对CSS框架比较熟悉,例如Bootstrap,那么你应该很熟悉这个概念。当往你的模板中添加组件的时候,通常都是一个接一个地显示,但是有了Grid你可以实现任何你想要的布局。
他的工作方式是将元素以行与列(放在行里面)的方式边靠边。例如:

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

以上代码将创建一个两行的布局,上面的布局有两列,下面的布局有三列。默认所有元素均匀分布,你也可以指定列的宽度:

<ion-row>
    <ion-col width-10></ion-col>
    <ion-col width-20></ion-col>
    <ion-col width-25></ion-col>
    <ion-col width-25></ion-col>
    <ion-col width-20></ion-col>
</ion-row>

以上代码将创建单独的一行,里面有5个不同宽度的列(你可以将列宽设置为100!)。
所有可用宽度请参考文档

图标 Icons

现在的应用大量用到图标,他比文本的伟大之处在于他可以漂亮的表达事物的表达内容。大部分时候,他更易用比按钮加上一个‘添加条目’之类的标签更好看。
Ionic提供超多的图标,例如:

<ion-icon name="heart"></ion-icon>

你只需要指出你需要使用的图标的名字即可。甚至他可以根据iOS和Android平台来切换不同的图标以更好的适配平台。所有可用图标可在此处查看。
Ionic还有很多其他的组件,即使这里已经讲过的组件,也有很多其他的细节需要你去了解,所以建议先阅读一下文档熟悉一下。

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

推荐阅读更多精彩内容