[Ionic 2從入門到精通] 5.6 自定義的管道和所有相片的飛頁(yè)

本節(jié)課中股毫,我們將制作自定義管道用來(lái)更友好的展示照片的拍攝日期,我們也將完成應(yīng)用的關(guān)鍵部分之一也就是slideshow困介。雖然他沒(méi)有拍照那么復(fù)雜大审,但是他算是整個(gè)應(yīng)用的靈魂。

創(chuàng)建一個(gè)自定義管道

我們?cè)诒緯幕A(chǔ)部分已經(jīng)涵蓋了管道是什么座哩,這里還是跟你簡(jiǎn)單溫習(xí)一下:管道實(shí)際上允許我們?cè)跀?shù)據(jù)進(jìn)行展示之前對(duì)他進(jìn)行修改徒扶。
我們此處的目標(biāo)是創(chuàng)建一個(gè)標(biāo)簽顯示此照片上幾天之前拍攝的,這樣根穷,“3 天前”姜骡,“10 天前”导坟。目前而言,我們已經(jīng)在照片的數(shù)據(jù)上存儲(chǔ)了拍攝日期圈澈,不幸的是惫周,他看起是醬紫的:

Sun Mar 06 2016 00:40:02 GMT+1000 (AEST)

也就是天底下最不友好的日期顯示方式。所以康栈,這里是@Pipe最好的使用情景:我們創(chuàng)建一個(gè)管道用來(lái)接收丑陋的日期格式递递,轉(zhuǎn)換到“X 天前”這樣的格式,然后返回之啥么。
我們先看看如何創(chuàng)建這個(gè)管道漾狼,然后在慢慢討論。
> 修改 src/pipes/days-agp.ts 為如下:

import { Injectable, Pipe } from '@angular/core';

@Pipe({
    name: 'daysAgo'
})
@Injectable()
export class DaysAgo {
    transform(value, args?) {
        let now = new Date();
        let oneDay = 24 * 60 * 60 * 1000;
        let diffDays = Math.round(Math.abs((value.getTime() - now.getTime())/(oneDay)));

        return diffDays;
    }
}

@Pipe裝飾器里面我們提佛那個(gè)一個(gè)名字daysAgo饥臂,意思就是在模板中可以直接通過(guò)使用這個(gè)名字作為關(guān)鍵字來(lái)使用這個(gè)管道逊躁。使用管道的時(shí)候,永遠(yuǎn)都需要傳入數(shù)據(jù)隅熙,然后數(shù)據(jù)都會(huì)被傳入transform函數(shù)也就是上面的value稽煤。我們會(huì)把我們的照片對(duì)象的Date對(duì)象傳入到這個(gè)管道,這就是我們這里要做的囚戚。同時(shí)注意可以通過(guò)管道傳入額外的參數(shù)酵熙,也就是我們?yōu)槭裁从?em>args?,因?yàn)檫@不是強(qiáng)制要求傳入的參數(shù)驰坊。
首先我們來(lái)一點(diǎn)數(shù)學(xué)魔法得出照片上幾天之前拍攝的匾二,(Stack Overflow也有這個(gè),我的解決方式可能比他丑點(diǎn)兒)拳芙,然后返回他察藐。返回的值就是將被渲染到模板上去的內(nèi)容。
如果你還記得之前的課的話舟扎,我們已經(jīng)在app.module.ts中設(shè)置好這個(gè)管道了分飞。
> 修改home.html中的photo項(xiàng)為如下:

<ion-item>
<img [src]="photo.image" />
<ion-badge item-right light>{{photo.date | daysAgo}} days ago</ion-badge>
</ion-item>

注意了(譯者敲了下黑板),我們加了這個(gè)句:

{{photo.date | daysAgo}}

這樣寫會(huì)把photo.date傳入到daysAgo管道睹限,然后將daysAgo返回的東西展示最這里譬猫。最終結(jié)果是一個(gè)帶有類似“5 天前”的徽章。

為所有照片創(chuàng)建一個(gè)Slideshow

我們已經(jīng)創(chuàng)建好了Slideshow的模板羡疗,所以現(xiàn)在我們需要制作一些邏輯來(lái)循環(huán)和展示所有照片染服,同時(shí)我們也要添加一個(gè)打開(kāi)slideshow的途徑(重啟途徑也要)。
我們還是先從playSlideshow函數(shù)開(kāi)始叨恨,這樣我們可以真正的打開(kāi)頁(yè)面柳刮。
> 修改 src/pages/home/home.ts的 playSlideshow 函數(shù)為如下:

playSlideshow(): void {
    if(this.photos.length > 1){
        let modal = this.modalCtrl.create(SlideshowPage, {photos:
        this.photos});
        modal.present();
    } else {
        let alert = this.simpleAlert.createAlert('Oops!', 'You need at least two photos before you can play a slideshow.');
        alert.present();
    }
}

跟創(chuàng)建警告提示框類似,我們給用戶撞見(jiàn)了一個(gè)模態(tài)框頁(yè)面。首先诚亚,我們創(chuàng)建了一個(gè)Modal,然后通過(guò)NavController呈現(xiàn)到用戶面前午乓。在這里站宗,我們使用已經(jīng)創(chuàng)建好的SlideshowPage來(lái)創(chuàng)建模態(tài)框,也將所有的照片數(shù)據(jù)傳入進(jìn)去益愈。這樣我們可以在Slideshow頁(yè)面上獲取到這些數(shù)據(jù)梢灭。
注意,我們只有在用戶有超過(guò)1張照片的時(shí)候才會(huì)觸發(fā)他(因?yàn)闆](méi)有或者只有1張照片的slideshow就不是真的slideshow了蒸其,對(duì)吧敏释?),否則會(huì)顯示警告提示框摸袁。
現(xiàn)在钥顽,我們來(lái)定義Slideshow頁(yè)的類定義。這個(gè)類挺小的靠汁,所以先全部貼出來(lái)蜂大,然后分段講解。
> 修改 src/pages/slideshow/slideshow.ts 為如下:

import { NavParams, ViewController } from 'ionic-angular';
import { Component, ElementRef, ViewChild } from '@angular/core';

@Component({
    selector: 'page-slideshow',
    templateUrl: 'slideshow.html'
})
export class SlideshowPage {
    @ViewChild('imagePlayer') imagePlayer: ElementRef;
    imagePlayerInterval: any;
    photos: any;

    constructor(public navParams: NavParams, public viewCtrl: ViewController) {
        this.photos = this.navParams.get('photos');
    }

    ionViewDidEnter(){
        this.playPhotos();
    }

    closeModal(){
        this.viewCtrl.dismiss();
    }

    playPhotos(){
        let imagePlayer = this.imagePlayer.nativeElement;
        let i = 0;
        //Clear any interval already set
        clearInterval(this.imagePlayerInterval);
        //Restart
        this.imagePlayerInterval = setInterval(() => {
            if(i < this.photos.length){
                imagePlayer.src = this.photos[i].image;
                i++;
            }
            else {
                clearInterval(this.imagePlayerInterval);
            }
        }, 500);
    }
}

這里有些東西可能你不大熟悉蝶怔。我們導(dǎo)入了NavParams服務(wù)可以用他拿到在創(chuàng)建的時(shí)候傳過(guò)來(lái)的數(shù)據(jù)奶浦。你可以看到我們?cè)跇?gòu)造器里面通過(guò)this.navParams.get('photos');獲取數(shù)據(jù)。這里另一個(gè)奇怪的東西是ViewController踢星。我們需要用到這個(gè)來(lái)隱藏模態(tài)框(我們這里定義了一個(gè)closeModal函數(shù)提供給模板里面的按鈕使用)澳叉。
這里最重要的函數(shù)是playPhotos,這就是我們循環(huán)所有照片然后在頁(yè)面上相應(yīng)改變對(duì)于的圖片元素的地方沐悦。首先成洗,我們通過(guò)之前設(shè)置好的@ViewChild引用得到圖片元素(之前模板里面通過(guò) #本地變量 的方式定義的)的引用,我們清理了當(dāng)前正在運(yùn)行的所有定時(shí)器(防止用戶在slideshow還在播放的時(shí)候突然重啟slideshow)藏否。然后我們開(kāi)始循環(huán)this.photos里的照片泌枪。如果還剩下照片可以展示,圖片的src屬性將會(huì)使用下一張照片的數(shù)據(jù)更新秕岛,如果沒(méi)有的話碌燕,就會(huì)清理計(jì)時(shí)器。上面代碼中继薛,定時(shí)器的間隔是500毫秒修壕,也就是0.5秒,我們可以根據(jù)個(gè)人喜好通過(guò)調(diào)整這個(gè)數(shù)值來(lái)調(diào)整slideshow的快和慢遏考。(甚至給用戶提供選擇來(lái)控制)
playPhotos函數(shù)上ionViewDidEnter函數(shù)自動(dòng)觸發(fā)的慈鸠,ionViewDisEnter函數(shù)上在進(jìn)入視圖的時(shí)候自動(dòng)執(zhí)行的,這個(gè)函數(shù)在我們每次進(jìn)入視圖的時(shí)候都會(huì)執(zhí)行灌具。

總結(jié)

這是另一節(jié)比較小的課青团,但是這里講的東西都蠻酷的譬巫。至此,應(yīng)用的大部分主體功能都完成了督笆,我們只要加上一些邊邊角角就可以了芦昔。當(dāng)然,我們還是得梅花他娃肿,但是下節(jié)課我們要學(xué)習(xí)的是整合本地通知和社交分享功能咕缎。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市料扰,隨后出現(xiàn)的幾起案子凭豪,更是在濱河造成了極大的恐慌,老刑警劉巖晒杈,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嫂伞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡拯钻,警方通過(guò)查閱死者的電腦和手機(jī)末早,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)说庭,“玉大人然磷,你說(shuō)我怎么就攤上這事】浚” “怎么了姿搜?”我有些...
    開(kāi)封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)捆憎。 經(jīng)常有香客問(wèn)我舅柜,道長(zhǎng),這世上最難降的妖魔是什么躲惰? 我笑而不...
    開(kāi)封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任致份,我火速辦了婚禮,結(jié)果婚禮上础拨,老公的妹妹穿的比我還像新娘氮块。我一直安慰自己,他們只是感情好诡宗,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布滔蝉。 她就那樣靜靜地躺著,像睡著了一般塔沃。 火紅的嫁衣襯著肌膚如雪蝠引。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音螃概,去河邊找鬼矫夯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吊洼,可吹牛的內(nèi)容都是我干的训貌。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼融蹂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了弄企?” 一聲冷哼從身側(cè)響起超燃,我...
    開(kāi)封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拘领,沒(méi)想到半個(gè)月后意乓,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡约素,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年届良,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片圣猎。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡士葫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出送悔,到底是詐尸還是另有隱情慢显,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布欠啤,位于F島的核電站荚藻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏洁段。R本人自食惡果不足惜应狱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望祠丝。 院中可真熱鬧疾呻,春花似錦、人聲如沸写半。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)污朽。三九已至散吵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背矾睦。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工晦款, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人枚冗。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓缓溅,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親赁温。 傳聞我的和親對(duì)象是個(gè)殘疾皇子坛怪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容