ローディングコントローラの使い方

処理に時間がかかり、ユーザーに少しの間待っていてもらいたい場合には、処理中を表すアニメーションと「ロード中...」などのメッセージを見せることがよく行われます。

本来はユーザーを待たせないようにできるのが一番ですが、やむを得ない場合には、画面がフリーズした状態で待ってもらうよりは、 アニメーションでもいいので、動いていた方が良いものです。

Ionic フレームワークではこうした「ロード中...」メッセージを制御するための、LoadingController が利用できます。

HTTP の応答を待つ例

モバイルアプリから非同期処理を行う代表例として、次の例では HTTP リクエストを送り、その応答を待つ例を示します。

サーバー側は、次のような PHP スクリプトで JSON 文字を返すことにします。

<?php
session_start();

if( !isset($_SESSION['led']) || !$_SESSION['led']) {
	$_SESSION['led'] = 'off';
}

if( isset($_REQUEST['op']) && $_REQUEST['op'] ) {
	if( $_REQUEST['op'] == 'on' ){
		$_SESSION['led'] = 'on';
	}
	elseif( $_REQUEST['op'] == 'off' ) {
		$_SESSION['led'] = 'off';
	}
	else {
		// Do nothing
	}
}

$r = array( 'status' => $_SESSION['led'] );

sleep(3);

echo json_encode( $r );

?>

応答は次のような JSON です。

{"status":"off"}

off または on を返します。

Ionic プロジェクトの作成と HTTP プラグインのインストール

さて、ここでスマートフォン側のテスト機は、アンドロイドを利用したので、プロジェクトは次のように作成しました。

$ ionic start loading1 blank --v2
$ cd loading1
$ ionic platform add android
$ ionic plugin add cordova-plugin-http
$ npm install --save @ionic-native/http

HTTP リクエストを送るために cordova-plugin-http プラグインを利用します。

home.html テンプレートは次のようにします。

<ion-header>
  <ion-navbar>
    <ion-title>
      LED Controller
    </ion-title>
  </ion-navbar>
</ion-header>
<ion-content padding>
  <button ion-button block
    (click)="onClick()"
    [color]="(ledStatus == 'unknown') ? 'light' : ((ledStatus == 'on') ? 'danger' : 'dark')">{{ledStatus}}</button>
</ion-content>

home.ts は次の通りです。

import { Component } from '@angular/core';
import { LoadingController } from 'ionic-angular';
import { HTTP } from '@ionic-native/http';

@Component({
  selector: 'page-home',
  templateUrl: 'home.html',
  providers: [ HTTP, LoadingController ],
})
export class HomePage {

  ledStatus: string = 'unknown';

  constructor(
    public http: HTTP,
    public loadingCtrl: LoadingController,
    ) {}

  onClick(){
    this.updateStatus();
  }

  updateStatus(){
    let op: string = "";
    switch(this.ledStatus){
      case "on":
        op = "off";
        break;
      case "off":
        op = "on";
        break;
    }

    this.sendReq(op);
  }

  sendReq(op: string){
    let url: string = `上記スクリプトの URL はここ`;
    
    // "Please wait..." を表示
    let loader = this.loadingCtrl.create({
      spinner: "dots",
      content: "Please wait..."
    });
    loader.present();

    // HTTP リクエストを送信 (スクリプトで op というパラメータを受けとる)
    this.http.get(url,{'op':op},{})
    .then((httpResp)=>{
      loader.dismiss();
      let r = JSON.parse(httpResp.data);
      switch(r.status){
        case 'on':
          this.ledStatus = 'on';
          break;
        case 'off':
          this.ledStatus = 'off';
          break;
      }
    })
    .catch((err)=>{
      console.log(err);

      loader.dismiss();
      this.ledStatus = 'unknown';
    });
  }
}

今回のポイントは LoadingController です。このインスタンスをコンストラクタで受け取っています。

今回は spinner プロパティで "dots" という文字を渡しています。特にスピナーの種類を指定しなければ、 プラットフォームに依存して既定のスピナーが表示されますので、特別な理由が無い限り指定しない方がよいと思います。

アンドロイド端末上で実行するには次のコマンドです。

$ ionic run android