1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SAPUI5 BTP Fiori m.tableでgrowing(無限スクロール)を実装する方法

Posted at

SMARTTABLEでプロパティを設定すると実装できるgrowingをm.tableで実装するとつまったのでまとめました

はじめに

SAPUI5SMARTTABLEでは、growingプロパティを使えば簡単に「もっと見る」形式のページング(Lazy Loading)が実装できます。

<SmartTable
    id="smartTable"
    entitySet="Products"
    tableType="ResponsiveTable"
    useExportToExcel="true"
    useVariantManagement="true"
    useTablePersonalisation="true"
    header="Products"
    showRowCount="true"
    growing="true" />

このように、growing="true" をつけるだけでスクロールや「もっと見る」ボタンによるロードが可能です。

しかし、m.Tableで同様の挙動を実装しようとしたときに、思ったより手こずったので、その方法と詰まったポイントをまとめます。


前提

  • UI5 バージョン: 1.108
  • 使用コンポーネント: sap.m.Table
  • データ取得方法: OData V2(JSONModelでも応用可)

m.Tableでgrowingを実装する基本

まずは基本のm.Table定義

<Table
    id="productTable"
    growing="true"
    growingScrollToLoad="true"
    items="{
        path: '/Products'
    }">
    <columns>
        <Column>
            <Text text="Product ID" />
        </Column>
        <Column>
            <Text text="Name" />
        </Column>
    </columns>
    <items>
        <ColumnListItem>
            <cells>
                <Text text="{ProductID}" />
                <Text text="{Name}" />
            </cells>
        </ColumnListItem>
    </items>
</Table>

ここで重要なのは以下の2つのプロパティ:

  • growing="true":growing機能を有効にする
  • growingScrollToLoad="true":スクロールで自動ロード(falseの場合は「もっと見る」ボタン)

詰まったポイント

1. growingが効かない!

最初にgrowingを設定してもうまく機能せず…。

原因:

  • バインディング先が静的データだった(growingは基本的にバックエンドとの連携で効果を発揮)
  • growingThresholdが設定されていなかった
  • Modelに設定したデータ量が少なすぎた(そもそもgrowingする必要がなかった)

対処:

  • 適切なデータ件数(例:50件以上)を用意
  • growingThresholdを明示的に設定
growingThreshold="20"

2. テーブルが更新されない

スクロールしてもデータが増えない…。ロードのトリガーが発火しない。

原因:

  • コントローラー側でデータの追加ロード処理を書いていなかった
  • Modelに全部のデータを最初から読み込んでいた

対処:

  • ODataの場合、$top$skipパラメータでサーバーから段階的に取得
  • onUpdateFinishedイベントなどで状態を確認

まとめ

  • SmartTableは非常に便利だが、自動で色々やってくれる分「ブラックボックス」的な部分もある。
  • m.Tableは手間はかかるけど、細かく制御したいときには柔軟。
  • growingを有効にするには、データの準備とバインディング方法が非常に重要。

おまけ:JSONModelでのgrowing例

onInit: function () {
    var oData = {
        Products: []
    };

    for (var i = 0; i < 100; i++) {
        oData.Products.push({
            ProductID: i + 1,
            Name: "Product " + (i + 1)
        });
    }

    var oModel = new JSONModel(oData);
    this.getView().setModel(oModel);
}

これでスクロールに応じて読み込みが行われるようになります。


さいごに

m.Tablegrowingを使うには、いくつかハマりどころがありますが、仕組みがわかればSmartTableよりも柔軟に使える場面が増えます。
この記事が誰かの「ハマりポイント回避」に役立てば幸いです!


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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?