ionic3.x开发记录


组件使用篇

ion-navbar

  ion-navbar组件在定义上是做为导航栏使用,且附带一个回退按钮。在导航栏内可以包含标题,任意数量的按钮,片段或搜索栏。但该组件必须放置在<ion-header>中,以便将它们放置在内容的上方。在官方对该组件的注释中有这么一句话 – 'It's important to note that navbar's are part of the dynamic navigation stack.',意思是导航栏是动态导航堆栈的一部分,因此如果想使用静态工具栏,可以使用ion-toolbar

ionc-toolbar

  ion-toolbar组件做为一个静态工具栏,和ion-navbar不同的是,它可以在应用程序中用作标题,子标题,页脚或甚至子页脚的通用栏。当组件放置在<ion-header><ion-footer>内时,组件固定在其各自的位置上。当放置在<ion-content>内时,组件将随内容滚动。

ion-content

  ion-content是做为页面主体内容组件存在的,在视图组件中应当只有一个ion-content存在。这里主要记录下ion-content的滚动监听用法。

   Scroll events happen outside of Angular's Zones. This is for performance reasons. So if you're trying to bind a value to any scroll event, it will need to be wrapped in a zone.run()

  以上是官方对于滚动监听做出的解释,在出于性能方面的考虑,如果你试图绑定一个值到任何滚动事件,它将需要被包裹在一个zone.run()方法中。现假如项目有个UI方面的设计,当视图发生滚动,顶部的navbar需要做出相应的渐变颜色,隐藏显示等动态效果变化。

import { Content } from 'ionic-angular';

export class ScrollPage {
    @ViewChild(Content) content: Content;

    constructor(public zone: NgZone) { }

    // 组件加载完成,对页面的滑动进行监听
    ionViewDidLoad() {
        this.content.ionScroll.subscribe(($event: any) => {
            this.zone.run(() => {
                // 当前滑动的距离
                let top = $event.scrollTop;
                // ... do something eg: change class/layout/hidden/display
            })
        })
    }
}

ion-slides

  ion-slides是一个幻灯片容器组件,和ion-slide幻灯片组件组合使用,容器内可以包含任意数量的幻灯片组件。这里主要讲解下常用属性和切换视图停止播放的问题。

Attr Type Details
autoplay number 幻灯片切换时的延迟事件,毫秒级别,未启用该参数则禁止自动播放,默认值为null并且不会自动播放幻灯片。
direction string 滑动方向:“horizontal”或“vertical”。默认值:horizontal。
effect string 幻灯片的动画效果。其值可以为slide, fade, cube, coverflow 或者flip。 默认值: slide。
initialSlide number 初始幻灯片的下标索引。 默认值: 0。
loop boolean 是否启用循环播放的功能,即播放至最后一张幻灯片后循环到第一张幻灯片
pager boolean 是否启用分页
paginationType string 分页的类型,该属性与pager配合使用,若pager未启用,则无效。其值可以为bullets, fraction, progress。默认值:bullets。
speed number 幻灯片之间的过渡时间,毫秒级别。默认值:300。
zoom boolean 是否启用缩放功能。

  关于幻灯片停止播放的bug,主要有两个触发操作,一个是用户在拖拽滑动幻灯片时,幻灯片会停止播放;另一个则是在进入其他视图,包括tab页的切换,都会触发幻灯片停止播放。这里记录下相应的解决方案及代码。

<!-- slides.html -->
<ion-content>
    <!-- 监听幻灯片关闭自动播放事件 -->
    <ion-slides autoplay="3000" speed="300" loop (ionSlideAutoplayStop)="startAutoPlay()">
      <ion-slide>
        <h1>Slide 1</h1>
      </ion-slide>
      <ion-slide>
        <h1>Slide 2</h1>
      </ion-slide>
    </ion-slides>
</ion-content>
// slides.ts
import { Slides } from 'ionic-angular';
import { ViewChild } from '@angular/core';

export class SlidesPage {

    @ViewChild(Slides) slides: Slides;

    // 进入当前视图时启动自动播放  
    ionViewDidEnter(){  
        this.startAutoPlay();  
    }  

    // 离开当前视图时停止自动播放  
    ionViewDidLeave(){   
        this.stopAutoPlay();  
    }  

    // 启动自动播放
    startAutoPlay(){
        this.slides.startAutoplay();
    }

    // 停止自动播放
    stopAutoPlay(){
        this.slides.stopAutoplay();
    }
}

Events使用篇

Events
   Events is a publish-subscribe style event system for sending and responding to application-level events across your app.

  官方解释中Events是一套发布 - 订阅式事件系统,用于发送和响应应用程序级别的事件。在开发项目过程中,纠结于在回退的时候怎么传递选中的数据。网上有人将callback做为参数传递,虽然可以实现,但终究感觉不太美观。在翻阅文档的时候,发现了Events Api,通过发布-订阅事件完美的实现了需求。

/* 选择优惠券界面 */
import { Events  } from 'ionic-angular';

export class ConfirmOrderCouponPage {
    constructor(private events: Events) { }
}

// 使用优惠券
useCoupon() {
    // 回退至确认订单页面
    this.navCtrl.popTo("ConfirmOrderPage");
    // 通过ionic的Events通信传递选中的优惠券
    this.events.publish('order: use-coupon', this.selectCoupon);
}
/* 确认订单界面 */
import { Events } from 'ionic-angular';

export class ConfirmOrderPage {
    constructor(private events: Events) { }
}

ionViewDidLoad() {
    // 订阅选中优惠券事件
    this.events.subscribe('order: use-coupon', (coupon) => {
        this.coupon = coupon;
        console.log(this.coupon);
    });
}

更新于 2018.3.2,未完待续…

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐