2
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?

More than 3 years have passed since last update.

【SAPUI5】動的なFragment表示(ダイアログとポップオーバー)

Posted at

はじめに

動的なフラグメント表示は良くあることですが、
フラグメント内のコントロールによって表示方法が少し異なると気づきました。

今回気づいた下記2つについてまとめておこうと思います。

  • ダイアログ
  • ポップオーバー

前提

ボタンを2つ用意しただけの簡単な画面を用意しておきます。
それぞれのボタン押下時にフラグメントを表示していきます。

コメント 2020-05-29 203922.png

プロジェクトは以下のように構成しています。

コメント 2020-05-29 204018.png

上記で紹介したボタンを2つ表示した画面はApp.view.xmlです。
以下のようしています。

<mvc:View 
	controllerName="sample.sample.controller.App" 
	xmlns:mvc="sap.ui.core.mvc" 
	displayBlock="true" 
	xmlns="sap.m">
	<Shell id="shell">
		<App id="app">
			<pages>
				<Page id="AppPage" title="{i18n>title}" showHeader="false">
					<content>
						<Button id="test" text="ダイアログ表示" press="onOpenDialog" class="sapUiMediumMarginBeginEnd" />
						<Button text="ポップオーバー表示" press="onOpenPopover" />
					</content>
				</Page>
			</pages>
		</App>
	</Shell>
</mvc:View>

ダイアログを表示

ダイアログ表示用のためXMLファイルを用意します。

<core:FragmentDefinition
   xmlns="sap.m"
   xmlns:core="sap.ui.core">
   <Dialog showHeader="false">
		<content>
			<List
				headerText="ダイアログが開きました"
				items="{path: 'testModel>/results'}">
				<StandardListItem
					title="{testModel>product}"
					counter="{testModel>price}">
				</StandardListItem>
			</List>
		</content>
		<buttons>
			<Button text="閉じる" press="onClose" />
		</buttons>
   </Dialog>
</core:FragmentDefinition>

Controllerに押下時のイベントを作成します。

onOpenDialog: function(oEvent) {
	if (!this.byId("dialogFragment")) {
		Fragment.load({
			id: "dialogFragment",
			name: "sample.sample.view.fragments.dialog",
			controller: this
		}).then(function (oDialog) {
			this.getView().addDependent(oDialog);
			oDialog.open();
		}.bind(this));
	} else {
		this.byId("dialogFragment").open();
	}
}

ダイアログ表示ボタンを押下してみると以下のようにダイアログが表示されました。
コメント 2020-05-29 204303.png

ポップオーバーを表示

次はポップオーバー表示用のためXMLファイルを用意します。

<core:FragmentDefinition
	xmlns="sap.m"
	xmlns:core="sap.ui.core">
	<ActionSheet>
		<Button text="パスタ" />
		<Button text="ラーメン" />
		<Button text="うどん" />
		<Button text="そば" />
	</ActionSheet>
</core:FragmentDefinition>

Controllerに押下時のイベントを作成します。
ポップオーバー表示の際は、this.getView().addDependentの後でopenByを使います。
openByの引数にポップオーバーを配置するコントロールを設定します。

onOpenPopover: function(oEvent) {
	var oButton = oEvent.getSource();
	if (!this.byId("popoverFragment")) {
		Fragment.load({
			id: "popoverFragment",
			name: "sample.sample.view.fragments.popover",
			controller: this
		}).then(function (oDialog) {
			this.getView().addDependent(oDialog);
			oDialog.openBy(oButton);	// ダイアログの表示とはここが違う
		}.bind(this));
	} else {
		this.byId("popoverFragment").open();
	}
}

ポップ―オーバー表示ボタンを押下してみると以下のようにポップオーバーが表示されました。
コメント 2020-05-29 212655.png

試しにダイアログ表示ボタンにポップオーバーを配置してみることにします。
XMLファイルは変更せず、Controllerのみ一部修正します。

onOpenPopover: function(oEvent) {
	// var oButton = oEvent.getSource();
	var oButton = this.getView().byId("test");  // ダイアログ表示ボタンのIdを指定
	if (!this.byId("popoverFragment")) {
		Fragment.load({
			id: "popoverFragment",
			name: "sample.sample.view.fragments.popover",
			controller: this
		}).then(function (oTarget) {
			this.getView().addDependent(oTarget);
			oTarget.openBy(oButton);
		}.bind(this));
	} else {
		this.byId("popoverFragment").open();
	}
}

ポップオーバーの配置がダイアログ表示ボタンの下に変わりました。
コメント 2020-05-29 212549.png

今回はUI5コントローラーにポップオーバーを配置しましたが、DOMの参照でもいいようです。
https://sapui5.hana.ondemand.com/1.68.1/#/api/sap.m.Popover/methods/openBy

2
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
2
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?