美文网首页Ionic Frameworkhybrid APP(ionic)ionic2
[Ionic 2从入门到精通] 6.7 重用组件

[Ionic 2从入门到精通] 6.7 重用组件

作者: 老牛啃码 | 来源:发表于2018-05-17 19:45 被阅读16次

听说你喜欢app,那么我就在你的app里面放一个app好了。目前为止我们的应用有三个标签页了,我们现在要加个全新的标签页了。我们本书的第一个应用QuickList跟咱们应用很搭调呢。外出露营的时候Checklist非常方便的说。
我们这节课要做的是基上就是将Quick List功能“拖放”到当前应用中。在Ionic 2和Angular 2 的模块化的天性之下,这些事情可以很轻易的实现。如果你之前已经创建好了Quick List的话,你只要去其中拷贝代码即可,如果没有的话,那么去下载的包里拷贝代码。
没有像“拖放”那么容易,因为直接拖放的话会有一些冲突,但是还是很直白。我们先从文件拷贝开始。
> 拷贝 QuickList 的 models 文件夹到 CamperMate 的 src 文件夹中
> 拷贝 QuickLists 的 checklist 页文件夹到 CamperMate的 pages 文件夹
这两部非常简单,但是现在我们会遇上一点小问题。我们也想要从QuickLists中拷贝HomePage,但是我们的CamperMate已经有HomePage了,所以我们需要做一点点变通。
> 在CamperMate 的 pages 文件夹内创建一个新的文件夹名为 quicklistshome
> 将 QuickLists 的 home文件夹里面的内容(home.ts,home.scss,home.html)拷贝到刚才新建的 quicklistshome 里面
> 将 home.ts,home.scss,home.html重命名为quicklistshome.ts,quicklistshome.scss, quicklistshome.html
现在得到的结果是我们从QuickLists中将他的整个home页都拷贝过来了,但是拷贝过来之后我们都重命名为quicklistshome,因为我们不想让他和已有的home页有冲突。如果对上面的内容感觉比较迷惑,那么请查看本书源代码的文件夹结构。
由于我们对文件名进行了变更,我们也需要对代码进行一些变动。我们需要将QuickLists Home Page的类名,同时我们也要修改模板的名字:
> 对 src/pages/quicklistshome/quicklistshome.ts 进行如下变更:

import { Component } from '@angular/core';
import { NavController, AlertController, Platform } from 'ionic-angular';
import { ChecklistPage } from '../checklist/checklist';
import { ChecklistModel } from '../../models/checklist-model';
import { Keyboard } from 'ionic-native';
import { Data } from '../../providers/data';

@Component({
    selector: 'page-quicklistshome',
    templateUrl: 'quicklistshome.html'
})
export class QuickListsHomePage {
    checklists: ChecklistModel[] = [];
    local: Storage;

    constructor(public nav: NavController, public platform: Platform, public dataService: Data, public alertCtrl: AlertController) {
    }

    ionViewDidLoad(){
    this.platform.ready().then(() => {
        this.dataService.getData().then((checklists) => {
            let savedChecklists: any = false;

            if(checklists && typeof(checklists) != "undefined"){
                savedChecklists = JSON.parse(checklists);
            }

            if(savedChecklists){
                savedChecklists.forEach((savedChecklist) => {
                    let loadChecklist = new ChecklistModel(savedChecklist.title, savedChecklist.items);
                    this.checklists.push(loadChecklist);

                    loadChecklist.checklist.subscribe(update => {
                        this.save();
                    });
                });
            }
        });
        });
    }
}

注意类型和templateUrl都变了。有一个我们忽略了的事情是我们没有将Quicklists应用的Data服务拷贝过来。这个因为我们的CamperMate应用已经有一个了,所以我们只要对他进行改动就可以了。
> 给 src/providers/data.ts 添加下面两个函数:

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

save(data: any): void {
    let saveData = [];
    //Remove observables
    data.forEach((checklist) => {
        saveData.push({
            title: checklist.title,
            items: checklist.items
        });
    });
    let newData = JSON.stringify(saveData);
    this.storage.set('checklists', newData);
}

这两个函数的命名方式和data.ts里面其他函数的命名方式不一样,保持这样的原因是避免对Quicklists功能做更多的修改。
样式方面没有多少要做的,但是我们的Quicklists应用的navbar都是用的secondary颜色,但是CamperMate用的是primary,所以我们需要对它进行改动。
> 修改 src/pages/checklist/checklist.html 的navbar为如下:

<ion-navbar color="primary">

> 修改 src/pages/quicklistshome/quicklistshome.html 的navbar为如下:

<ion-navbar color="primary">

> 修改 src/pages/quicklistshome/quicklistshome.scss 为如下:

page-quicklistshome {
    ion-item-sliding {
        margin: 5px;
    } 

    .home-item {
        font-size: 1.2em;
        font-weight: bold;
        color: #282828;
        padding-top: 10px;
        padding-bottom: 10px;
    } 

    .secondary-detail {
        display: block;
        color: #cecece;
        font-weight: 400;
        margin-top: 10px;
    }
}

button {
    border: none !important;
}

这样一来,我们就在CamperMate应用里面完美移植了QuickLists功能了。我们现在只要加上对于的标签栏就可以了。
> 修改 src/pages/home/home.html以包含下面第四个标签栏

<ion-tabs>
<ion-tab [root]="tab1Root" tabTitle="Location" tabIcon="navigate"></ion-tab>
<ion-tab [root]="tab2Root" tabTitle="My Details" tabIcon="person"></ion-tab>
<ion-tab [root]="tab3Root" tabTitle="Camp Details" tabIcon="bookmarks"></ion-tab>
<ion-tab [root]="tab4Root" tabTitle="Checklists" tabIcon="checkbox"></ion-tab>
</ion-tabs>

这样我们就可以去类定义中定义tab4Root了。
> 修改 src/pages/home/home.ts到如下:

import { Component } from '@angular/core';
import { LocationPage } from '../location/location';
import { MyDetailsPage } from '../my-details/my-details';
import { CampDetailsPage } from '../camp-details/camp-details';
import { QuickListsHomePage } from '../quicklistshome/quicklistshome';

@Component({
    selector: 'page-home',
    templateUrl: 'home.html'
})
export class HomePage {

    tab1Root: any = LocationPage;
    tab2Root: any = MyDetailsPage;
    tab3Root: any = CampDetailsPage;
    tab4Root: any = QuickListsHomePage;

    constructor(){

    }
}

新加的页面也需要去app.module.ts中进行导入。
> 修改src/app/app.module.ts 为如下:

import { NgModule } from '@angular/core';
import { IonicApp, IonicModule } from 'ionic-angular';
import { MyApp } from './app.component';
import { Storage } from '@ionic/storage';
import { HomePage } from '../pages/home/home';
import { LocationPage } from '../pages/location/location';
import { MyDetailsPage } from '../pages/my-details/my-details';
import { CampDetailsPage } from '../pages/camp-details/camp-details';
import { QuickListsHomePage } from '../pages/quicklistshome/quicklistshome';
import { ChecklistPage } from '../pages/checklist/checklist';
import { GoogleMaps } from '../providers/google-maps';
import { Connectivity } from '../providers/connectivity';
import { Data } from '../providers/data';

@NgModule({
    declarations: [
        MyApp,
        HomePage,
        LocationPage,
        MyDetailsPage,
        CampDetailsPage,
        QuickListsHomePage,
        ChecklistPage
    ],
    imports: [
        IonicModule.forRoot(MyApp)
    ],
    bootstrap: [IonicApp],
    entryComponents: [
        MyApp,
        HomePage,
        LocationPage,
        MyDetailsPage,
        CampDetailsPage,
        QuickListsHomePage,
        ChecklistPage
    ],
    providers: [Storage, Data, GoogleMaps, Connectivity]
})
export class AppModule {}

现在加载应用的话,应该可以看到一个新的标签页:

5.8.1.jpg

如你所见,这样模组是项目结构使得重用其他应用中的代码非常简单,如果用同名组件的话就会更简单了。
我们的应用现在看起来已经很好了,但是下节课我们要加入一点样式让他更好看些。

相关文章

  • [Ionic 2从入门到精通] 6.7 重用组件

    听说你喜欢app,那么我就在你的app里面放一个app好了。目前为止我们的应用有三个标签页了,我们现在要加个全新的...

  • Ionic 2从入门到精通

    由于近日Gitbook升级, 在Gitbook翻译的两本书最近没有浏览量了, 所以近期打算搬运到这里来。 Ioni...

  • [Ionic 2从入门到精通] 结束

    如果你挺过来了整个课程(或者没有挺过来),我会给你一个大大的... 谢谢! 不仅是因为在这学习HTML5移动应用开...

  • Ionic 2从入门到精通:目录

    目录 1 介绍 欢迎! 更新日志 新概念 2 Ionic 2 基础 第一课:生成一个Ionic 2应用 第二课:剖...

  • [Ionic 2从入门到精通] 译者注

    译者于2017-5-2日看完全书,基本跑通所有代码,除IBM PouchDB部分外。 译者的 ionic info...

  • [Ionic 2从入门到精通] 2.5 类

    上一个部分我们详细了解了什么是装饰器。概括起来就是类定义上面那一小段代码,声明这个类是什么、这个类需要什么、以及这...

  • [Ionic 2从入门到精通] 5.3 布局

    我发现制作一个应用最好从基础布局开始 -- 他基本可以看作是线图联系,帮助固化应用的需求。我们这个应用的布局没啥特...

  • [Ionic 2从入门到精通] 2.8 导航

    如果你有Ionic 1或者Angular 1的背景,那么你以前应该处理过URL,状态等之间的路由导航。Ionic在...

  • [Ionic 2从入门到精通] 3.8 总结

    恭喜你完成了Quick Lists学习指南了。这对入门者小试牛刀来讲是在合适不过的一个选择了,我们通过他学习到了:...

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

    模板,个人认为是Ionic 2中最有趣的东西。也是框架能力厉害的地方。看看下面的代码: 上面代码在没有额外样式的情...

网友评论

    本文标题:[Ionic 2从入门到精通] 6.7 重用组件

    本文链接:https://www.haomeiwen.com/subject/ibeidftx.html