Ionic2 组件使用示例

Ionic2的官方文档相对是比较详细的,但也是因为分类较多,所以来回查看比较费劲,而且一些API的用法也有不清楚和错误的地方。这里总结下我用到的一些组件的示例。

ActionSheet

ActionSheet
import {ActionSheetController, AlertController} from 'ionic-angular';
export class HomePage {
constructor(private actionSheet: ActionSheetController, private alertCtrl: AlertController) {
showActionSheet() {
    let isIos = this.commonService.isIos;
    let actionSheet = this.actionSheet.create({
      title: '常用字段管理',
      buttons: [
        {
          text: '添加',
          icon: isIos ? null: 'add-circle',
          handler: () => {
            this.addField();
          }
        },
        {
          text: '清除',
          icon: isIos ? null: 'remove-circle',
          handler: ()=>{
            this.clearCommonFields();
          }
        },
        {
          text: '取消',
          icon: isIos ? null: 'close',
          role: 'cancel',
          handler: () =>{}
        }
      ]
    });
    actionSheet.present();
  }
}

addField() {
    let alert = this.alertCtrl.create({
      title: '添加常用字段',
      inputs: [
        {
          name: 'name',
          placeholder: '字段名称'
        },
        {
          name: 'defValue',
          placeholder: '默认值'
        }
      ],
      buttons: [
        {
          text: '取消',
          role: 'cancel',
          handler: data => {
          }
        },
        {
          text: '确认',
          handler: data => {
            if (data.name == null || data.name == '') {
              this.commonService.showToast('字段的名称不能为空', 'top');
              return false;
            } else {
              //省略
            }
            }
          }
        }
      ]
    });
    alert.present();
  }

ActionSheet在Android和IOS上样式有差,IOS是不支持带icon的,所以通过Platform.is('ios')判断设备系统;
handler: 给一个function,若想函数执行完alert不消失,可以通过 return false实现;

Alert

Alert
  • prompt 带输入框
showPrompt() {
    let prompt = this.alert.create({
      title: '自定义订单',
      inputs: [
        {
          name: 'title',
          placeholder: '自定义订单名'
        }
      ],
      buttons: [
        {
          text: '取消',
          handler: data => {
          }
        },
        {
          text: '保存',
          handler: data => {
                ...
            });
          }
        }
      ]
    });
    prompt.present();
  }
  • confirm
showConfirm() {
    let alert = this.alert.create({
        title: '清除历史订单',
      message: '确认清除该设备推过的所有订单记录',
      buttons: [
        {
          text: '取消',
          role: 'cancel',
          handler: () => {
            console.log('canceled');
          }
        },
        {
          text: '清除',
          handler: ()=>{
            this.clearHistory();
          }
        }
      ]
    });
    alert.present();
  }

Select

Select
<ion-list no-lines>
      <ion-item>
        <ion-label>报文类型</ion-label>
        <ion-select [(ngModel)]="version" (ngModelChange)="version=$event; changeVersion()"
                    cancelText="取消" okText="确认">
          <ion-option value="1.0.0">1.0.0</ion-option>
          <ion-option value="5.0.0">5.0.0</ion-option>
        </ion-select>
      </ion-item>
</ion-list>

input ion-item-sliding

<ion-list *ngIf="!noCommonFields" class="common-field">
    <ion-list-header color="light">
      常用字段
    </ion-list-header>
    <ion-item-sliding *ngFor="let item of commonFields">
      <ion-item>
        <ion-label>{{item.name}}</ion-label>
        <ion-input type="text" clearInput value="{{item.defValue}}" [(ngModel)]="item.defValue"></ion-input>
      </ion-item>
      <ion-item-options>
        <button ion-button (click)="deleteField(item.name);$event.stopPropagation()" color="danger">
          <ion-icon name="trash"></ion-icon>
          删除
        </button>
      </ion-item-options>
    </ion-item-sliding>
  </ion-list>

ion-label,ionic2提供三种形式,fixed,label显示在输入框左边,floating,当选中输入框时或有文本时,label会浮在输入框左上方, inline,默认值
*ngFor="let item of commonFields"这是Angluar2对于Angular1里ng-repeat的写法,注意不要犯少掉*或ngFor写成ngfor的错误;
<ion-item-sliding></ion-item-sliding>是支持滑动弹出按钮的控件;
(click)="deleteField(item.name);$event.stopPropagation()"这里因为滑动弹出的按钮显示在input控件上,为了防止按钮事件传递,需添加$event.stopPropagation();

Buttons

<ion-buttons>
        <button ion-button round color="light"  tappable (click)="toDetail()">编辑订单</button>
        <button ion-button round color="secondary" [disabled]="isSendClicked" (click)="sendOrder()">提交订单</button>
</ion-buttons>

//click事件
sendOrder() {
    this.isSendClicked = true;
    ...
    setTimeout(() => {
      this.isSendClicked = false;
    }, 1500);
  }

为了防止按钮的连续点击多次触发事件,通过[disabled]绑定变量和setTimeout方法设置延时;
在非button标签元素设置点击事件时,可能出现点击响应较慢的情况,标签里添加tappable属性即可。

SearchBar

SearchBar
<ion-searchbar (ionInput)="getItems($event)">
</ion-searchbar>

//搜索
getItems(ev: any) {
    this.initData(true);
    let searchText = ev.target.value;
    if (searchText && searchText.trim() != '') {
      this.items = this.items.filter((item) => {
        let label = item.label;
        return (label.toLowerCase().indexOf(searchText.toLowerCase()) > -1);
      })
    }
  }

在搜索框的绑定事件中调用你的数据刷新方法;

Segment

Segments

这是一个类似于tabs的按钮组,展示在同一行,笔者在一个页面中通过segment去切换List中的内容。
实际使用中遇到了bug,与ngFor会冲突,代码如下:

<ion-segment [(ngModel)]="selectedSys" (ionChange)="sysChanged()">
      <ion-segment-button *ngFor="let sys of systems" value="{{sys}}">
        {{sys}}
      </ion-segment-button>
    </ion-segment>

执行以上代码会发现无法切换segment,查git上issue,发现该问题讨论挺多,应该是个当前版本未修复的bug,回复里有不少提供了解决方案,笔者使用的解决方法是通过ngIf去判断数组是否存在,修改代码:

<ion-segment [(ngModel)]="selectedSys" *ngIf="systems" (ionChange)="sysChanged()">
      <ion-segment-button *ngFor="let sys of systems" value="{{sys}}">
        {{sys}}
      </ion-segment-button>
    </ion-segment>

添加*ngIf="systems",然后在ts中写切换segment的事件即可。

sysChanged(){
    console.log('change system'+ this.selectedSys);
    this.refreshList(this.selectedSys).then(data=>{
      this.releaseList = data;
    });
  }

更新
后面开发过程中,segment这种写法出现一个bug: 当在ts中动态添加了segment button数组后,后面添加的segment-button无法active,git上有相关issue,尚未解决。
解决方法:利用<ion-segment-button>的(ionSelect)方法代替<ion-segment>的(ionChange);

<ion-segment [(ngModel)]="selectedSys" *ngIf="curSystems">
    <ion-segment-button *ngFor="let sys of curSystems" value="{{sys}}" 
              (ionSelect)="changeSys(sys)">
      {{sys}}
    </ion-segment-button>
  </ion-segment>

Modals

了解Bootstrap的童鞋应该都知道,模态框,在当前页面弹出一个页面组件。笔者一开始使用命令行创建一个新页面作为modal,实际运行后却一直提示no provider for page xxx。然而笔者已经在app.moudle中引入该页,后改为将modal作为内部组件写在需弹出的页面,代码如下:

//弹出model的事件
showMore(release) {
    this.modal.create(ReleaseDetailModal, {release: release}).present();
  }

/**
 * 内部类,modal
 */
@Component({
  template: `
<ion-header>

  <ion-navbar>
    <ion-title>版本信息</ion-title>
    <ion-buttons end>
    <button ion-button (click)="dismiss()">
    <span ion-text color="light" showWhen="ios">Cancel</span>
    <ion-icon name="md-close" showWhen="android"></ion-icon>
    </button>
  </ion-buttons>
  </ion-navbar>
</ion-header>

<ion-content padding>

  <ion-list>
    <ion-item *ngFor="let item of releaseInfo">
      {{item.name}}
      <ion-badge item-right color="light" contenteditable="true">
        {{item.value}}
      </ion-badge>
    </ion-item>
  </ion-list>

</ion-content>
`
})
export class ReleaseDetailModal {
  public release;
  public releaseInfo = [];

  constructor(public navCtrl: NavController, public navParams: NavParams,
              public viewCtrl: ViewController) {
    this.release = this.navParams.get('release');
    for (let key in this.release) {
    ....
  }

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

推荐阅读更多精彩内容

  • 菜心的品牌基因法不知道大家有没有忘记,之前有写过两篇,今天来写第三篇——实战篇,根据真实的案例来再次讲述如何运用品...
    菜心设计铺阅读 1,541评论 0 23
  • Earth SongMichael Jackson - HIStory: Past, Present and Fu...
    helen1990_阅读 314评论 0 0
  • 三年多来,一个问题总在困扰着我:我的路该怎么走?总不能就这么在无限期的迷茫中浪费一年又一年的光阴,纵然工作有...
    最平凡阅读 179评论 0 0
  • 《神游》 游游荡荡逛逛 我在想 路有多长 星宿移动着方向 指向你的旅航 沉寂路上 匍匐着花香 一个人的步伐 能听到...
    Vanson_阅读 211评论 0 2