跟着官方示例项目学Ionic-3

针对Ionic-4

传送门
跟着官方示例项目学Ionic-1(blank,tabs)
跟着官方示例项目学Ionic-2(tutorial,sidemenu)
跟着官方示例项目学Ionic-3(super)
跟着官方示例项目学Ionic-4(conference)

super 工程

The Ionic Super Starter is a batteries-included starter project for Ionic apps
complete with pre-built pages, providers, and best practices for Ionic
development.

Ionic Super 起步工程是一个拥有最佳开发实践,并且预置了一系列的页面、提供器等相对完整的Ionic应用。

super-starter.png

主组件app.component.ts

Super页面的主页面和Tutorial基本一致,都是<ion-menu>加上<ion-nav>.

  1. menuClose属性
    在页面模板中Button加上了menuClose属性,通过API文档可知,这样在就不需要手动调用
 this.menu.close();

去关闭菜单了.

  1. 翻译@ngx-translate集成
    Ionic使用的是@ngx-translate实现多语言功能.
    a. 在AppModule中进行初始化:
TranslateModule.forRoot({
      loader: {
        provide: TranslateLoader,
        useFactory: (createTranslateLoader),
        deps: [HttpClient]
      }
    }),

b.在MyApp中进行初始化

  initTranslate() {
    // Set the default language for translation strings, and the current language.
    // 默认为英语
    this.translate.setDefaultLang('en');
    // 读取浏览器的语言设置
    const browserLang = this.translate.getBrowserLang();
    // 如果能读到,并且是中文,需要特殊处理
    if (browserLang) {
      if (browserLang === 'zh') {
        // 额外读取一个getBrowserCultureLang值
        const browserCultureLang = this.translate.getBrowserCultureLang();
        // 判断简体还是繁体
        if (browserCultureLang.match(/-CN|CHS|Hans/i)) {
          this.translate.use('zh-cmn-Hans');
        } else if (browserCultureLang.match(/-TW|CHT|Hant/i)) {
          this.translate.use('zh-cmn-Hant');
        }
      } else {
        // 其他语言就直接设置
        this.translate.use(this.translate.getBrowserLang());
      }
    } else {
      this.translate.use('en'); // Set your language here
    }
    // 这里是在ts代码中,而非在html模板中取得翻译字符的方法,
    this.translate.get(['BACK_BUTTON_TEXT']).subscribe(values => {
      this.config.set('ios', 'backButtonText', values.BACK_BUTTON_TEXT);
    });
  }
  1. 集成IonicStorageModule持久化
    ionic提供了IonicStorageModule给应用作为持久化,
import { IonicStorageModule, Storage } from '@ionic/storage';
 IonicStorageModule.forRoot()

这样初始化后,就初始化了Storage提供器,并传递个setting页面完成设置的持久化保存.

storage-module.png

具体使用也很简单,是按照key-value的方式保存在IndexDB中的.

  1. Ionic的导航进阶
    在tutorial中,页面page都需要被nav跳转所在的页面知晓,这样在调用nav.setRoot()和nav.push()方法时候,就把对应的component传递过去,实现页面的跳转.
    Ionic在这点上做了改进,自己实现了一套更适应移动端的"面包屑导航",
    a.
    官方IonicPage的API
    官方IonicPageModule的API
    通过阅读可知最佳实践是使用@IonicPage+IoncPageModule作为路由的映射器方式进行导航.
    b. 具体的@IonicPage使用有点类似spirng的IOC,给Page起了个名字,这样具体导航页面时NavController就可以直接根据名字进行了.
    c. 另外也可以和router一样,支持动态参数如":id",在本工程中并没这么使用,需要传递参数时候,都直接包装在navParams里面传递.

models、mocks、providers

Super工程不仅仅是页面的展示,增加了更为真实的交互,于是有更多的Provider提供器完成具体的服务交互功能。

  1. API
    对RestAPi的处理,通过angular提供的HttpClient进行交互。(实际并没有example.com提供服务,因此调用都是失败的)
  2. Items
    相对于一个通用的模型对象,传入一个js对象,就自动包装成对应的Item类,并且使用mock目录的items替换了provider中仅仅是接口说明的items。在app.module.ts中
    ···js
    import { Items } from '../mocks/providers/items';
    ···
  3. User
    一个模拟用户操作的接口,调用api服务,实现了注册、登录、注销功能,并保存在一个_user状态(前端工程只需要维护一个用户即可)
  4. Setting
    一个利用@ionic/storage完成简单的设置持久化功能。

页面的跳转流程

主组件指定的FirstRunPage为TutorialPage,在TutorialPage进入WelcomePage,然后进入LoginPage或者SignupPage,

FirstRunPage为TutorialPage

                                                                                   |─── ItemCreatePage
                            |──  LoginPage ──|              |─ ListMasterPage ─|---|
                            |                |              |                  |   |─── ItemDetailPage
TutorialPage-- WelcomePage -|                |---- Tabs ----|─   SearchPage   ─| 
                            |                |              |                  | 
                            |── SignupPage ──|              |── SettingsPage ──|
 

menu、card、content是游离在导航之外的,只能从menu点击进去。

Pages

  1. TutorialPage使用了<ion-slides>和<<ion-slide>实现引导页的滑动展示,虽然看上去是多页,实际上只有一个Page.需要注意的是

a. page页面的生命周期

Page Event Returns Description 描述
ionViewDidLoad void Runs when the page has loaded. This event only happens once per page being created. If a page leaves but is cached, then this event will not fire again on a subsequent viewing. The ionViewDidLoad event is good place to put your setup code for the page.
ionViewWillEnter void Runs when the page is about to enter and become the active page.
ionViewDidEnter void Runs when the page has fully entered and is now the active page. This event will fire, whether it was the first load or a cached page.
ionViewWillLeave void Runs when the page is about to leave and no longer be the active page.
ionViewDidLeave void Runs when the page has finished leaving and is no longer the active page.
ionViewWillUnload void Runs when the page is about to be destroyed and have its elements removed.
ionViewCanEnter boolean/Promise<void> Runs before the view can enter. This can be used as a sort of "guard" in authenticated views where you need to check permissions before the view can enter
ionViewCanLeave boolean/Promise<void> Runs before the view can leave. This can be used as a sort of "guard" in authenticated views where you need to check permissions before the view can leave
  ionViewDidEnter() {
    // the root left menu should be disabled on the tutorial page
    this.menu.enable(false);
  }

  ionViewWillLeave() {
    // enable the root left menu when leaving the tutorial page
    this.menu.enable(true);
  }

在进人引导页时候,隐藏菜单;离开时候,显示菜单.

b. slide的官方文档

Slides- API
Slide- API

  1. Welcome页面
    标准的ionic页面,无特殊.

  2. Signup页面
    a. 注册功能
    调用User完成注册,并且无论成功失败,都进入MainPage.
    b. ToastController
    ToastController是Ioinc显示提示功能的控件,ToastController-API

 presentToast() {
  // 传递参数构造一个toast
  let toast = this.toastCtrl.create({
    message: 'User was added successfully',
    duration: 3000,
    position: 'top'
  });
  // 规定toast消失动作-打印日志
  toast.onDidDismiss(() => {
    console.log('Dismissed toast');
  });
  // 展示toast
  toast.present();
}
  1. Login页面
    与Signup页面几乎一样
  2. Tabs页面
    并无特殊,展示3个子Tab.
  3. ListMasterPage、ItemDetailPage、ItemCreatePage页面
    a. 通过ModalController展示ItemCreatePage页面

   /**
   * Prompt the user to add a new item. This shows our ItemCreatePage in a
   * modal and then adds the new item to our data source if the user created one.
   */
  addItem() {
    let addModal = this.modalCtrl.create('ItemCreatePage');
    addModal.onDidDismiss(item => {
      if (item) {
        this.items.add(item);
      }
    })
    addModal.present();
  }

b. 使用Camera插件进行拍照

   /**
   获取照片
   */
getPicture() {
    if (Camera['installed']()) {
      this.camera.getPicture({
        destinationType: this.camera.DestinationType.DATA_URL,
        targetWidth: 96,
        targetHeight: 96
      }).then((data) => {
        this.form.patchValue({ 'profilePic': 'data:image/jpg;base64,' + data });
      }, (err) => {
        alert('Unable to take photo');
      })
    } else {
      this.fileInput.nativeElement.click();
    }
  }

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

推荐阅读更多精彩内容

  • 1、前言 本文主要记录做小项目时所需要用到的技术栈。小项目的场景如:特定的活动页,某app的运营推广页,Hybri...
    风之化身呀阅读 2,939评论 3 3
  • 离家的那一刻有再多的不满,现在看来都是不舍。
    馒头点心阅读 147评论 0 0
  • 关于aidl文件的启用 写好aidl的文件之后,并且配置好mainifests文件之后,需要make一下!
    学渣罗小贱阅读 278评论 0 0