LoginSignup
1
0

More than 3 years have passed since last update.

cordova でのスマホアプリ開発 4

Last updated at Posted at 2019-08-09

Ionic での機能作成

ionic ならではの機能をいくつかピックアップして作成してみる

https://ionicframework.com/jp/docs/api/slides
https://ionicframework.com/jp/docs/api/reorder
https://ionicframework.com/jp/docs/api/infinite-scroll

slides

前回作成した tab4 にスライダーを組み込んでみる

\src\app\tab4\tab4.page.ts

import { Component } from '@angular/core';

@Component({
  selector: 'app-tab4',
  template: `
    <ion-slides pager="true" [options]="slideOpts" style="width:100%;height:100%">
      <ion-slide>
        <h1>Slide 1</h1>
      </ion-slide>
      <ion-slide>
        <h1>Slide 2</h1>
      </ion-slide>
      <ion-slide>
        <h1>Slide 3</h1>
      </ion-slide>
    </ion-slides>
  `,
  styleUrls: ['./tab4.page.scss'],
})
export class Tab4Page {
  slideOpts = {
    initialSlide: 0,
    speed: 400
  };
  constructor() {}
}

style="width:100%;height:100%" を指定しないと異様に狭かったり、2ページ目が見えてしまっていたりするので注意

initialSlide: 0 で初期ページを指定できる

slides.png

reorder

新たに tab5 を作成し、リオーダーを組み込んでみる

※tab5 を作成する手順は省略

\src\app\tab5\tab5.page.ts

import { Component } from '@angular/core';
import { IonReorderGroup } from '@ionic/angular';

@Component({
  selector: 'app-tab5',
  template: `
<ion-reorder-group (ionItemReorder)="doReorder($event)" disabled="false">
  <ion-item>
    <ion-reorder slot="start"></ion-reorder>
    <ion-label>
      Item 1
    </ion-label>
  </ion-item>
  <ion-item>
    <ion-reorder slot="start"></ion-reorder>
    <ion-label>
      Item 2
    </ion-label>
  </ion-item>
  <ion-item>
    <ion-reorder slot="start"></ion-reorder>
    <ion-label>
      Item 3
    </ion-label>
  </ion-item>
  <ion-item>
    <ion-reorder slot="start"></ion-reorder>
    <ion-label>
      Item 4
    </ion-label>
  </ion-item>
  <!-- Custom reorder icon end items -->
  <ion-item>
    <ion-reorder slot="start"></ion-reorder>
    <ion-label>
      Item 5
    </ion-label>
  </ion-item>
  <ion-item>
    <ion-reorder slot="start"></ion-reorder>
    <ion-label>
      Item 6
    </ion-label>
  </ion-item>
</ion-reorder-group>
  `,
  styleUrls: ['./tab5.page.scss'],
})
export class Tab5Page {

  constructor() { }

  doReorder(event) {
    event.detail.complete();
  }

}

event.detail.complete(); はイベントを利用する場合のお約束

reorder.png

infinite-scroll

※infinite-scroll は tab 内で利用すると読込イベントが発生しなかった為、別ページとして作成

まずはページ作成

C:\cordova_app\helloIonic>ionic g
? What would you like to generate? page
? Name/path of page: scroll
> ng.cmd generate page scroll
CREATE src/app/scroll/scroll.module.ts (543 bytes)
CREATE src/app/scroll/scroll.page.html (125 bytes)
CREATE src/app/scroll/scroll.page.spec.ts (691 bytes)
CREATE src/app/scroll/scroll.page.ts (256 bytes)
CREATE src/app/scroll/scroll.page.scss (0 bytes)
UPDATE src/app/app-routing.module.ts (459 bytes)
[OK] Generated page!

作成したページに infinite-scroll を組み込んでいく

\src\app\scroll\scroll.page.ts

import { Component, ViewChild } from '@angular/core';
import { IonInfiniteScroll } from '@ionic/angular';

@Component({
  selector: 'app-scroll',
  templateUrl: 'scroll.page.html',
  styleUrls: ['scroll.page.scss'],
})

export class ScrollPage {

  @ViewChild(IonInfiniteScroll) infiniteScroll: IonInfiniteScroll;

  dataList:any;

  constructor() {
    this.dataList = [];
    console.log('init');
    for (let i = 0; i < 25; i++) { 
      this.dataList.push("Item number "+this.dataList.length);
    }
  }

  loadData(event) {
    console.log('event');
    setTimeout(() => {
      console.log('Done');
      for (let i = 0; i < 25; i++) { 
        this.dataList.push("Item number "+this.dataList.length);
      }
      event.target.complete();
      if (this.dataList.length == 1000) {
        event.target.disabled = true;
      }
    }, 500);
  }

}

constructor では初期表示分25行を dataList として定義

loadData は末尾までスクロールした場合の再読込イベント

初期表示と同じように25行分を dataLlist に追加し

1000行に到達するとスクロールイベントを無効化する

\src\app\scroll\scroll.page.html

<ion-header>
  <ion-toolbar>
    <ion-title>scroll</ion-title>
  </ion-toolbar>
</ion-header>

<ion-content overflow-scroll='false'>
  <ion-list>
    <ion-item *ngFor="let item of dataList">
      <ion-label>{{item}}</ion-label>
    </ion-item>
  </ion-list>
  <ion-infinite-scroll threshold="100px" (ionInfinite)="loadData($event)">
    <ion-infinite-scroll-content
      loadingSpinner="bubbles"
      loadingText="Loading more data...">
    </ion-infinite-scroll-content>
  </ion-infinite-scroll>
</ion-content>

ion-list がリスト表示部、ion-infinite-scroll がイベント定義

*ngFor="let item of dataList" で dataList を item として定義し、存在する分ループさせる

{{item}} でデータバインドされる。もし要素が存在する場合は {{item.value}} とすることで参照可能

末尾まで行くとロードイベントが発生し行が追加される

scroll.png

cordova でのスマホアプリ開発 5

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0