[Ionic 2從入門到精通] 4.5 設(shè)置

現(xiàn)在應(yīng)用運(yùn)行良好 -- 來(lái)自reddit的GIF,過(guò)濾了文件格式畦娄,然后以video元素進(jìn)行展示又沾。
我們當(dāng)前設(shè)置了gifs作為默認(rèn)subdreddit,對(duì)于本應(yīng)用來(lái)講是個(gè)不錯(cuò)的選擇纷责,用戶也可以根據(jù)喜好對(duì)他進(jìn)行變更捍掺。當(dāng)你離開(kāi)應(yīng)用稍后重新進(jìn)入的時(shí)候,他會(huì)重新設(shè)置為默認(rèn)的gifssubreddit再膳。當(dāng)用戶對(duì)gifs不敢興趣的時(shí)候這會(huì)變得很煩人挺勿。
所以我們將要做的事制作一個(gè)Settings頁(yè),用戶可以在其中進(jìn)行如下操作:

  • 默認(rèn)subreddit
  • 每頁(yè)加載的GIF數(shù)量
  • 排序方式

實(shí)現(xiàn)類似這樣的功能也讓我們有機(jī)會(huì)去學(xué)習(xí)如何永久存儲(chǔ)數(shù)據(jù)這個(gè)應(yīng)用將在用戶返回的時(shí)候記得用戶設(shè)置喂柒。

制作一個(gè)Settings頁(yè)

我們將使用Modal模態(tài)頁(yè)來(lái)打開(kāi)設(shè)置頁(yè)不瓶。打開(kāi)模態(tài)頁(yè)和普通頁(yè)面有些許不同,普通頁(yè)面的打開(kāi)基本就是應(yīng)用的導(dǎo)航流的操作了灾杰。模態(tài)頁(yè)基本上是一個(gè)可以在頁(yè)面上顯示然后關(guān)閉的單獨(dú)頁(yè)面(你應(yīng)該對(duì)其他網(wǎng)頁(yè)模態(tài)頁(yè)很熟悉蚊丐,例如Facebook的照片預(yù)覽)。
任何頁(yè)面都可以作為模態(tài)頁(yè)來(lái)打開(kāi)艳吠,所以我們可以像創(chuàng)建其他頁(yè)面那樣來(lái)創(chuàng)建我們的Settings頁(yè)面麦备。我們先從定義Settings頁(yè)的模板開(kāi)始。
> 修改 src/pages/settings/settings.html 為如下:

<ion-header>
    <ion-toolbar color="secondary">
        <ion-title>Settings</ion-title>
        <ion-buttons end>
            <button ion-button icon-only (click)="close()"><ion-icon name="close"></ion-icon></button>
        </ion-buttons>
    </ion-toolbar>
</ion-header>
<ion-content padding>
    <ion-card>
        <ion-card-header>
        About
        </ion-card-header>
        <ion-card-content>
        <p><strong>Giflist</strong> is a client for <strong>reddit</strong>
        that will endlessly <strong>stream GIFs</strong> from <strong>any
        subreddit that predominantly contains gifs</strong>. By default
        it uses the popular <strong>gifs</strong> subreddit, but you can
        change this to whatever you like, e.g: perfectloops, me_irl,
        chemicalreactiongifs.</p>
        <br />
        <p>To play a GIF, just tap it. To view the original submission for
        any GIF, just tap the title section and it will open in reddit.
        You can configure some settings for the application below.
        Enjoy!</p>
        </ion-card-content>
    </ion-card>
    <h3>Subreddit</h3>
    <ion-input type="text" placeholder="enter subreddit name..." [(ngModel)]="subreddit"></ion-input>
    <h3>Sort</h3>
    <ion-segment color="secondary" [(ngModel)]="sort">
    <ion-segment-button value="hot">
    Hot
    </ion-segment-button>
    <ion-segment-button value="top">
    Top
    </ion-segment-button>
    <ion-segment-button value="new">
    New
    </ion-segment-button>
    </ion-segment>
    <h3>Per Page</h3>
    <ion-segment color="secondary" [(ngModel)]="perPage">
    <ion-segment-button value="5">
    5
    </ion-segment-button>
    <ion-segment-button value="10">
    10
    </ion-segment-button>
    <ion-segment-button value="15">
    15
    </ion-segment-button>
    </ion-segment>
    <button ion-button full (click)="save()" color="secondary" style="margin:20px 0px;">Save Settings</button>
</ion-content>

這里沒(méi)做什么瘋狂的事情。我們像往常那樣定義了navbar凛篙,然后給他添加了一個(gè)按鈕用于調(diào)用close函數(shù)關(guān)閉窗口黍匾。
我們添加了一個(gè)<ion-card>用來(lái)向用戶展示應(yīng)用信息,然后我們定義了一些不同的輸入域呛梆。我們定義了一個(gè)文本輸入域來(lái)設(shè)置subreddit锐涯,我們使用了片段組件來(lái)控制sortperPage值。所有這些數(shù)據(jù)都通過(guò)[(ngModel)] 進(jìn)行了雙向數(shù)據(jù)綁定填物,這樣在類定義里面就可以很容易訪問(wèn)到了纹腌。
> 修改 src/pages/settings/settings.ts 為如下:

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

@Component({
    selector: 'page-settings',
    templateUrl: 'settings.html'
})

export class SettingsPage {
    perPage: number;
    sort: string;
    subreddit: string;

    constructor(public view: ViewController, public navParams: NavParams) {
        this.perPage = this.navParams.get('perPage');
        this.sort = this.navParams.get('sort');
        this.subreddit = this.navParams.get('subreddit');
    }

    save(): void {
        let settings = {
            perPage: this.perPage,
            sort: this.sort,
            subreddit: this.subreddit
        };
        this.view.dismiss(settings);
    }

    close(): void {
        this.view.dismiss();
    }
}

可能你一眼就看到了我們?cè)谶@里用navParams來(lái)獲取一些值。早Home頁(yè)啟動(dòng)Settings頁(yè)的時(shí)候我們會(huì)傳過(guò)來(lái)一些值作為Settings頁(yè)的預(yù)設(shè)值滞磺。
另一個(gè)比較奇怪的是我們導(dǎo)入了ViewController -- 當(dāng)以Modal的方式來(lái)啟動(dòng)本頁(yè)的時(shí)候我們需要用到他在頁(yè)面里關(guān)閉本身升薯。在這里我們需要在用戶點(diǎn)擊關(guān)閉或者保存按鈕的時(shí)候關(guān)閉頁(yè)面。如果用戶點(diǎn)擊關(guān)閉按鈕的話雁刷,我們就不用保存設(shè)置覆劈。
在接下來(lái)的部分我們會(huì)處理設(shè)置的保存保礼,但是你可以會(huì)想要怎么才能做到呢 -- 這里的save函數(shù)不是用來(lái)保存一些數(shù)據(jù)的嗎沛励?由于Modal的工作方式的原因,我們可以從以模態(tài)框方式啟動(dòng)的頁(yè)面在關(guān)閉的時(shí)候返回?cái)?shù)據(jù)炮障,所以在這里我們調(diào)用視圖的dismiss函數(shù)的時(shí)候?qū)?huì)把新的設(shè)置值回傳到Home頁(yè)面目派,也就是Setting頁(yè)面的啟動(dòng)也 -- 我們會(huì)在其中操作數(shù)據(jù)的保存。

以模態(tài)頁(yè)的方式打開(kāi)Settings頁(yè)

現(xiàn)在胁赢,定義好了Settings頁(yè)面企蹭,我們需要已模態(tài)也的方式啟動(dòng)他。我們?cè)缇驮陧?yè)首設(shè)置了一個(gè)按鈕來(lái)打開(kāi)設(shè)置頁(yè)智末,所以我們只要完成openSettings函數(shù)就可以了谅摄。
> 修改 src/pages/home/home.ts 的 openSettings 函數(shù)為如下:

openSettings(): void {
    let settingsModal = this.modalCtrl.create(SettingsPage, {
        perPage: this.redditService.perPage,
        sort: this.redditService.sort,
        subreddit: this.redditService.subreddit
    });

    settingsModal.onDidDismiss(settings => {
        if(settings){
            this.redditService.perPage = settings.perPage;
            this.redditService.sort = settings.sort;
            this.redditService.subreddit = settings.subreddit;
            //this.dataService.save(settings);
            this.changeSubreddit();
        }
    });

    settingsModal.present();
}

你也看到了,我們將Settings頁(yè)傳入了正在創(chuàng)建的Modal系馆,同時(shí)也傳入了Settings需要獲取的數(shù)據(jù)送漠。
我們?cè)O(shè)置了onDisDismiss監(jiān)聽(tīng)器用于偵測(cè)Moal關(guān)閉的時(shí)候回傳的數(shù)據(jù)。由于我們只在用戶點(diǎn)擊保存的時(shí)候才會(huì)穿數(shù)據(jù)由蘑,所以代碼也只會(huì)在此時(shí)機(jī)運(yùn)行闽寡。如果回傳了設(shè)置數(shù)據(jù),我們就要用新的值來(lái)更新當(dāng)前值尼酿,同時(shí)我們也要使用dataService來(lái)保存值到存儲(chǔ)(我們還是需要去定義這個(gè)服務(wù))爷狈。由于我們現(xiàn)在有了新的設(shè)置,所以我們需要調(diào)用changeSubreddit來(lái)重置所有事情和根據(jù)新設(shè)置加載新的GIF裳擎。
注意:由于我們目前沒(méi)有實(shí)現(xiàn)數(shù)據(jù)服務(wù)涎永,我們目前會(huì)注釋掉這個(gè)服務(wù)的調(diào)用。
最后,我們調(diào)用present方法來(lái)將模態(tài)框展示給用戶羡微。

保存數(shù)據(jù)

謎團(tuán)的最后一層是制作Data服務(wù)來(lái)保存設(shè)置到存儲(chǔ)以及從存儲(chǔ)獲取設(shè)置支救。
我們將使用Ionic提供的Storage服務(wù)來(lái)存儲(chǔ)數(shù)據(jù)。這也是我最喜歡的Ionic 2新增功能之一拷淘,因?yàn)樗審?fù)雜的存儲(chǔ)流程變得超級(jí)簡(jiǎn)單各墨。存儲(chǔ)數(shù)據(jù)中問(wèn)題有很多,例如操作系統(tǒng)隨機(jī)清理本地緩存數(shù)據(jù)启涯,但是這個(gè)存儲(chǔ)服務(wù)自動(dòng)使用最佳的存儲(chǔ)方式贬堵。
> 修改 src/providers/data.ts 為如下:

import { Injectable } from '@angular/core';
import { Storage } from '@ionic/storage';

@Injectable()
export class Data {
    constructor(public storage: Storage) {
    }

    getData(): Promise<any> {
        return this.storage.get('settings');
    }

    save(data): void {
        let newData = JSON.stringify(data);
        this.storage.set('settings', newData);
    }
}

首先,我們?cè)跇?gòu)造器里注入了存儲(chǔ)服務(wù)结洼。然后我們有兩個(gè)函數(shù)黎做,一個(gè)用于獲取數(shù)據(jù),一個(gè)用于存儲(chǔ)數(shù)據(jù)松忍。getData()函數(shù)將返回所有存儲(chǔ)與存儲(chǔ)空間中的‘settings’上的數(shù)據(jù)蒸殿,save()將把新的數(shù)據(jù)存放到存儲(chǔ)空間的‘settings’字段上。我們以及在Settings模態(tài)框關(guān)閉的時(shí)候調(diào)用了save()鸣峭,現(xiàn)在我們只需要定義localSettings函數(shù)用于在應(yīng)用打開(kāi)的時(shí)候加載之前保存的設(shè)置宏所。
> 修改 src/pages/home/home.ts 的loadSettings函數(shù)為如下:

loadSettings(): void {
    this.dataService.getData().then((settings) => {
        if(settings && typeof(settings) != "undefined"){
            let newSettings = JSON.parse(settings);
            this.redditService.settings = newSettings;
            if(newSettings.length != 0){
                this.redditService.sort = newSettings.sort;
                this.redditService.perPage = newSettings.perPage;
                this.redditService.subreddit = newSettings.subreddit;
            }
        }
        this.changeSubreddit();
    });
}

此處我們簡(jiǎn)單的調(diào)用了data服務(wù)的getData函數(shù),當(dāng)數(shù)據(jù)返回的時(shí)候摊溶,我們將他JSON為一個(gè)對(duì)象爬骤,讀取數(shù)據(jù)到Reddit提供者的成員變量。然后我們調(diào)用了changeSubreddit函數(shù)來(lái)觸發(fā)使用新數(shù)據(jù)加載新帖子莫换。
現(xiàn)在我們有了數(shù)據(jù)服務(wù)的實(shí)現(xiàn)霞玄,我們可以拿掉拿掉之前數(shù)據(jù)解除之前的注釋。
> 修改 home.ts的 openSettings 函數(shù)為如下:

openSettings(): void {
    let settingsModal = this.modalCtrl.create(SettingsPage, {
        perPage: this.redditService.perPage,
        sort: this.redditService.sort,
        subreddit: this.redditService.subreddit
    });

    settingsModal.onDidDismiss(settings => {
        if(settings){
            this.redditService.perPage = settings.perPage;
            this.redditService.sort = settings.sort;
            this.redditService.subreddit = settings.subreddit;
            this.dataService.save(settings);
            this.changeSubreddit();
        }
    });

    settingsModal.present();
}

總結(jié)

現(xiàn)在我們完成了設(shè)置頁(yè)和數(shù)據(jù)服務(wù)拉岁,應(yīng)用的功能就全部完成了坷剧!雖然現(xiàn)在看起來(lái)還是那么難看。
所以我們還有一節(jié)課的時(shí)間來(lái)添加一些自定義的樣式讓他好看些喊暖。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末惫企,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子哄啄,更是在濱河造成了極大的恐慌雅任,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咨跌,死亡現(xiàn)場(chǎng)離奇詭異沪么,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)锌半,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門禽车,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)寇漫,“玉大人,你說(shuō)我怎么就攤上這事殉摔≈莞欤” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵逸月,是天一觀的道長(zhǎng)栓撞。 經(jīng)常有香客問(wèn)我,道長(zhǎng)碗硬,這世上最難降的妖魔是什么瓤湘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮恩尾,結(jié)果婚禮上弛说,老公的妹妹穿的比我還像新娘。我一直安慰自己翰意,他們只是感情好木人,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著冀偶,像睡著了一般醒第。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蔫磨,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天淘讥,我揣著相機(jī)與錄音圃伶,去河邊找鬼堤如。 笑死,一個(gè)胖子當(dāng)著我的面吹牛窒朋,可吹牛的內(nèi)容都是我干的搀罢。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼侥猩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼榔至!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起欺劳,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤唧取,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后划提,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體枫弟,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年鹏往,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淡诗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖韩容,靈堂內(nèi)的尸體忽然破棺而出款违,到底是詐尸還是另有隱情,我是刑警寧澤群凶,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布插爹,位于F島的核電站,受9級(jí)特大地震影響请梢,放射性物質(zhì)發(fā)生泄漏递惋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一溢陪、第九天 我趴在偏房一處隱蔽的房頂上張望萍虽。 院中可真熱鬧,春花似錦形真、人聲如沸杉编。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)邓馒。三九已至,卻和暖如春蛾坯,著一層夾襖步出監(jiān)牢的瞬間光酣,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工脉课, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留救军,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓倘零,卻偏偏與公主長(zhǎng)得像唱遭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子呈驶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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

  • 上一節(jié)課我們做好了所有的準(zhǔn)備工作拷泽,我們現(xiàn)在就要開(kāi)始進(jìn)行實(shí)際創(chuàng)作了。本課我們將聚焦于Home頁(yè)來(lái)把它改造成用來(lái)展示G...
    老判湔埃啃碼閱讀 151評(píng)論 0 0
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,166評(píng)論 25 707
  • 很感謝這次旅行司致,讓我們之間的感情更快的升溫。也感謝你聋迎,其實(shí)我一直很想去濟(jì)南脂矫,15年就曾經(jīng)計(jì)劃5.1去,但是落空砌庄,沒(méi)...
    Ailsa_mua閱讀 270評(píng)論 0 0
  • 1羹唠、知足療法在道上奕枢,是心理工作的根基,每一位咨詢師知足時(shí)佩微,就會(huì)啟動(dòng)連接自我與自性的狀態(tài)缝彬。讓來(lái)訪者感知從自我的混亂與...
    清荷_edfa閱讀 714評(píng)論 0 0
  • 影響別人的方法有很多種谷浅,用一些小技巧,確實(shí)能在不知不覺(jué)中影響別人奶卓,有一些是常識(shí)一疯,很多人都知道的,有一些你可能不知道...
    鹿蕾閱讀 485評(píng)論 7 22