Oracle JET Webアプリケーションで選択イベントを処理します
イントロダクション
Oracle JET WebアプリケーションのviewModelでOracle JavaScript Extension Toolkit (Oracle JET) APIを使用して、Oracle JETリスト・ビュー・コンポーネントのselected
属性変更リスナーに応答するイベント・ハンドラを作成できます。ユーザーがリスト内の項目を選択または選択解除すると、変更リスナーによってイベント・ハンドラがトリガーされます。イベント・ハンドラを使用してOracle JETデータ・プロバイダを移入できます。また、ビュー・コンポーネントが使用できる監視機能にデータ・プロバイダをバインドできます。イベント・ハンドラは、Oracle JET If BindingコンポーネントがビューのネストされたHTML要素を条件付きでレンダリングするために使用するブール変数も設定できます。マスター・リストのOracle JETリスト・ビュー・コンポーネントのselected
属性が空でない場合、変数はtrue
に設定され、ビューにはデータバインド詳細リストがレンダリングされます。選択解除イベントのためにselected
属性が空の場合、変数はfalseに設定され、ビューにはデータバインド詳細リストなしでコンテナがビューに表示されます。
目的
このチュートリアルでは、マスター詳細データを表示できるように、Oracle JET Webアプリケーションのユーザー・インタフェースを更新します。Oracle JETプロパティ変更リスナーを使用してJavaScriptイベント・ハンドラを作成する方法を学習します。また、Oracle JET If Bindingコンポーネントを使用して、リストの選択を処理する詳細リストを条件付きで表示する方法についても学習します。
前提条件
- JavaScriptランタイム、Node.jsおよび最新のOracle JETリリース・コマンドライン・インタフェースを使用して、Oracle JETアプリケーションを作成するために設定された開発環境
JET_Web_Application
フォルダにOracle JET Webアプリケーションを作成できるように、この学習パスでの前のチュートリアルの完了- 完了したアプリケーション jet_web_application_masterdetail_final.zipはオプションでダウンロードされます
タスク1:ビューでの選択動作の設定
ビューを更新して、「アクティビティ」リストおよび「アクティビティ・アイテム」リストでの行の選択を処理するようにリスト・ビュー・コンポーネントをカスタマイズします。Oracle JETリスト・ビュー・コンポーネントは、ユーザーの行選択のデータ項目をコンポーネントに移入するfirst-selected-item
属性を定義し、双方向バインディングを使用して監視可能に読み取ることができます。コンポーネントのon-selection-changed
属性を使用して、viewModelで定義したイベント・リスナーをバインドして、リストの選択/選択イベントを捕捉および処理します。
-
JET_Web_Application/src/ts/views
ディレクトリに移動し、エディタでdashboard.html
ファイルを開きます。 -
「アクティビティ」ヘッダーの下で、
id="activitiesList"
のoj-list-view
カスタムHTML要素を見つけて、gridlines.item
属性の後に選択動作属性を追加します。<h3 id="activitiesHeader">Activities</h3> <oj-list-view id="activitiesList" class="item-display" aria-labelledby="activitiesHeader" data="[[activityDataProvider]]" gridlines.item="visible" selection-mode="single" selected="{{selectedActivity}}" on-first-selected-item-changed="[[selectedActivityChanged]]" first-selected-item="{{firstSelectedActivity}}" scroll-policy="loadMoreOnScroll" scroll-policy-options.fetch-size="5"> <template slot="itemTemplate"> . . .
-
「アクティビティ・アイテム」ヘッダーの下で、
id="itemsList"
のoj-list-view
カスタムHTML要素を見つけて、gridlines.item
属性の後に選択動作属性を追加します。<h3 id="itemsListHeader">Activity Items</h3> <oj-list-view id="itemsList" class="item-display" data="[[itemsDataProvider]]" aria-labelledby="itemsListHeader" gridlines.item="visible" selection-mode="single" selected="{{selectedItem}}" on-first-selected-item-changed="[[selectedItemChanged]]" first-selected-item="{{firstSelectedItem}}" scroll-policy="loadMoreOnScroll" scroll-policy-options.fetch-size="5"> <template slot="itemTemplate"> . . .
-
dashboard.html
ファイルを保存します。ファイルは event-task1-dashboard-html.txtに似ています。
タスク2: ViewModelでのイベント・ハンドラの作成
viewModelを更新して、「アクティビティ」リストおよび「アクティビティ・アイテム」リストの選択に応答するリスト・ビュー・コンポーネントのイベント・ハンドラを追加します。Oracle JETリスト・ビュー・コンポーネントは、Oracle JETリスト・ビューAPIでプロパティ変更リスナーを定義するselected
属性を定義します。ユーザーがリスト選択を行い、selected
属性の値が変更されると、イベント・ハンドラによってselectedActivity
およびselectedItem
が使用可能になります。
-
JET_Web_Application/src/ts/viewModels
ディレクトリに移動し、エディタでdashboard.ts
ファイルを開きます。 -
pieSeriesValue
観測可能定義の下、constructor()
の前に、「アクティビティ・リスト」の選択および「アクティビティ・アイテム」リストの選択の可観測性を追加します。class DashboardViewModel { . . . pieSeriesValue: ko.ObservableArray; // Observables for Activities selectedActivity = new ObservableKeySet(); activitySelected = ko.observable(false); // Controls display of Activity Items firstSelectedActivity = ko.observable(); selectedActivityIds = ko.observable(); // Observables for Activity Items itemSelected = ko.observable(false); selectedItem = ko.observable(); firstSelectedItem = ko.observable(); constructor() { . . .
-
dashboard.ts
ファイルの上部で、ojs/ojknockout-keyset
モジュールからObservableKeySet
クラスとojs/ojlistview
モジュールからojListView
クラスをインポートします。import * as ko from "knockout"; . . . import "ojs/ojavatar"; import { ObservableKeySet } from "ojs/ojknockout-keyset"; import { ojListView } from "ojs/ojlistview";
-
DashboardViewModel
クラスの前に、ActivityItems
タイプの別名を追加します。. . . type ActivityItems = { id: number; name: string; items: Array<Item>; short_desc: string; image: string; }; class DashboardViewModel { . . .
-
DashboardViewModel
クラスのconstructor()
メソッド宣言の後、選択および選択解除イベントを処理するためのテスト条件を持つselectedActivityChanged
イベント・ハンドラを追加します。} // End of constructor function selectedActivityChanged = (event: ojListView.firstSelectedItemChanged<ActivityItems["id"], ActivityItems>) => { /** * If no items are selected then the firstSelectedItem property returns an object * with both key and data properties set to null. */ let itemContext = event.detail.value.data; if (itemContext != null) { // If selection, populate and display list } else { // If deselection, hide list } };
次のステップでこのイベント・ハンドラを実装します。
-
selectedActivityChanged
イベント・ハンドラのif
文内で、itemsArray
変数を使用して監視可能なitemsDataProvider
を移入し、選択イベントに対してactivitySelected
およびitemSelected
選択状態観測可能値をtrue
に設定します。selectedActivityChanged = (event: ojListView.firstSelectedItemChanged<ActivityItems["id"], ActivityItems>) => { /** * If no items are selected, then this property firstSelectedItem * will return an object with both key and data properties set to null. */ let itemContext = event.detail.value.data; if (itemContext != null) { // If selection, populate and display list // Hide currently-selected activity item this.activitySelected(false); let itemsArray = itemContext.items; this.itemsDataProvider.data = itemsArray; // Set List View properties this.activitySelected(true); this.itemSelected(false); this.selectedItem(); this.itemData(); } else { // If deselection, hide list } };
-
selectedActivityChanged
イベント・ハンドラのelse
文内で、選択解除イベントのactivitySelected
およびitemSelected
選択状態観測可能値をfalse
に設定します。selectedActivityChanged = (event: ojListView.firstSelectedItemChanged<ActivityItems["id"], ActivityItems>) => { /** * If no items are selected then this property firstSelectedItem will return an * object with both key and data properties set to null. */ let itemContext = event.detail.value.data; if (itemContext != null) { . . . } else { // If deselection, hide list this.activitySelected(false); this.itemSelected(false); } };
-
selectedActivityChanged
イベント・ハンドラの後に、選択および選択解除イベントを処理するためのテスト条件を持つselectedItemChanged
イベント・ハンドラを追加します。selectedActivityChanged = (event: ojListView.firstSelectedItemChanged<ActivityItems["id"], ActivityItems>) => { . . . }; /** * Handle selection from Activity Items list */ selectedItemChanged = (event: ojListView.firstSelectedItemChanged<Item["id"], Item>) => { let isClicked = event.detail.value.data; if (isClicked != null) { // If selection, populate and display list } else { // If deselection, hide list } };
次のステップでこのイベント・ハンドラを実装します。
-
selectedItemChanged
イベント・ハンドラのif
文で、itemData
を可観測可能に移入し、pieSeries
配列変数を使用してpieSeriesValue
を可観測可能に移入してから、選択イベントに対してitemSelected
選択状態をtrue
に設定します。selectedItemChanged = (event: ojListView.firstSelectedItemChanged<Item["id"], Item>) => { let isClicked = event.detail.value.data; if (isClicked != null) { // If selection, populate and display list this.itemData(event.detail.value.data); // Create variable and get attributes of the items list to set pie chart values let pieSeries = [ { name: "Quantity in Stock", items: [this.itemData().quantity_instock] }, { name: "Quantity Shipped", items: [this.itemData().quantity_shipped] } ]; // Update the pie chart with the data this.pieSeriesValue(pieSeries); this.itemSelected(true); } else { // If deselection, hide list } };
-
selectedItemChanged
イベント・ハンドラのelse
文で、選択解除イベントのitemSelected
選択状態をfalse
に設定します。selectedItemChanged = (event: ojListView.firstSelectedItemChanged<Item["id"], Item>) => { if (isClicked != null) { . . . } else { // If deselection, hide list this.itemSelected(false); } };
-
dashboard.ts
ファイルを保存します。このファイルは、final-event-dashboard-ts.txtのようになります。
タスク3:ビューでのリスト・レンダリングの条件付き設定
Oracle JETのIf Bindingコンポーネントを使用してビューを更新し、詳細リストを条件付きでレンダリングします。Oracle JETのIf Bindingコンポーネントは、そのtest
属性でブール変数を取ります。1つの「If Binding」コンポーネント内で、「Activity Items」コンテナをネストし、別の「If Binding」コンポーネントで「Item Details」コンテナをネストします。次に、If Bindingコンポーネントを使用して、オブザーバブルactivitySelected
およびitemSelected
の状態をテストします。テスト条件がtrue
の場合は、If Bindingコンポーネントのネストされたコンテンツがレンダリングされます。リスト・イベント・ハンドラによって設定されたとおり、監視可能がtrue
の場合、データバインド・リストを表示します。別のIf Bindingコンポーネントを使用して、監視可能がfalse
かどうかをテストしてから、リストの選択をユーザーに指示するメッセージを含むコンテナを表示します。
-
JET_Web_Application/src/ts/views
ディレクトリに移動し、エディタでdashboard.html
ファイルを開きます。 -
id="parentContainer2"
のdiv
要素を検索します。その上で、oj-bind-if
カスタムHTML要素の開始タグを追加し、test
属性をactivitySelected
観測可能の状態に設定します。. . . </oj-list-view> </div> <oj-bind-if test="[[activitySelected()]]"> <div id="parentContainer2" class="oj-flex oj-flex-item oj-panel oj-bg-danger-30 oj-lg-padding-6x oj-md-8 oj-sm-12"> <div id="activityItemsContainer" class="oj-flex-item oj-md-6 oj-sm-12"> <h3 id="itemsListHeader">Activity Items</h3> . . .
ユーザーが「アクティビティ」リストからアクティビティを選択すると、viewModelアクティビティ変更済イベント・ハンドラによって、
activitySelected
が監視可能な値がtrue
に設定されます。この場合、oj-bind-if
テスト条件が満たされ、アプリケーションによってアクティビティ選択の「アクティビティ・アイテム」コンテナがレンダリングされます。監視可能プロパティの()
表記法は、監視可能オブジェクトのインスタンスを取得するのではなく、監視可能な値を取得するKnockout関数規則です。 -
id="itemDetailsContainer"
というdiv
要素を検索し、その上にtest
属性がitemSelected
観測可能の状態に設定されたoj-bind-if
カスタムHTML要素の開始タグを追加します。. . . </oj-list-view> </div> <oj-bind-if test="[[itemSelected()]]"> <div id="itemDetailsContainer" class="oj-flex-item oj-panel oj-bg-neutral-30 oj-md-6 oj-sm-12"> <h3>Item Details</h3> . . .
ユーザーが「アクティビティ・アイテム」リストからアイテムを選択すると、viewModel「アイテム変更済」イベント・ハンドラによって
itemSelected
がtrue
に設定されます。この場合、oj-bind-if
テスト条件が満たされ、アプリケーションによってアクティビティ・アイテム選択の「アイテム詳細」コンテナがレンダリングされます。 -
dashboard.html
ファイルの下部で、2つの終了</div>
タグをカウントし、終了</oj-bind-if>
タグを追加して、開始<oj-bind-if test ="[[activitySelected()]]">
タグに一致させます。終了</div>
タグをもう1つカウントしてから、開始<oj-bind-if test ="[[itemSelected()]]">
タグに終了</oj-bind-if>
タグを追加します。. . . </oj-chart> </div> </div> </oj-bind-if> </div> </oj-bind-if> </div> </div>
-
追加した終了
</oj-bind-if>
タグ(ファイルの末尾に最も近い)の下に、Oracle JEToj-flex-item oj-sm-6
フレックス・レイアウト・ヘルパー・クラスを含むdiv
要素を含むoj-bind-if test="[[!activitySelected()]]"
カスタムHTML要素を挿入します。. . . </oj-bind-if> </div> </oj-bind-if> <oj-bind-if test="[[!activitySelected()]]"> <div class="oj-flex-item oj-sm-6"> <p>Select an Activity to see Items</p> </div> </oj-bind-if> </div> </div>
Oracle JET
oj-sm-6
ヘルパー・クラスは、Select an Activity to see Items
見出しのコンテナが、小さい画面サイズおよび大きい画面サイズの6つのコンテナ列を占めることを指定します。ユーザーがアクティビティを選択するまで、
activitySelected
はfalse
です。同様に、ユーザーが[Ctrl]キーを押してすでに選択されているアクティビティをクリックすると、viewModelはこのイベントが選別として処理され、アクティビティ変更済イベント・ハンドラによってactivitySelected
がfalse
に設定されるようになります。どちらの場合も、oj-bind-if
テスト条件はブールfalse
条件によって満たされ、アプリケーションはSelect an Activity to see Items
ヘッダーをレンダリングします。 -
ファイルの最初の終了
</oj-bind-if>
タグの下に、Oracle JEToj-flex-item oj-sm-12 oj-md-6 flex
レイアウト・ヘルパー・クラスを含むdiv
要素を含むoj-bind-if test ="[[!itemSelected()]]"
カスタムHTML要素を追加します。. . . </oj-chart> </div> </div> </oj-bind-if> <oj-bind-if test="[[!itemSelected()]]"> <div class="oj-flex-item oj-sm-12 oj-md-6"> <p>Select an Item to see details</p> </div> </oj-bind-if> </div> </oj-bind-if> <oj-bind-if test="[[!activitySelected()]]"> <div class="oj-flex-item oj-sm-6"> <p>Select an Activity to see Items</p> </div> </oj-bind-if> </div> </div>
Oracle JET
oj-sm-12
およびoj-md-6
ヘルパー・クラスでは、詳細見出しを表示するSelect an Item
のコンテナが中画面サイズおよび大きい画面サイズの6つのコンテナ列を占有するか、小さい画面サイズの12個のコンテナ列を占有するように指定します。ユーザーがアクティビティ・アイテムを選択するまで、
itemSelected
はfalse
です。同様に、ユーザーが[Ctrl]キーを押し、すでに選択されているアクティビティ・アイテムをクリックすると、viewModelはこのイベントを選別として処理し、アイテム変更済イベント・ハンドラがitemSelected
をfalse
に設定します。どちらの場合も、oj-bind-if
テスト条件はブールfalse
条件によって満たされ、アプリケーションはSelect an Item to see details
ヘッダーをレンダリングします。 -
dashboard.html
ファイルを保存します。このファイルは、final-event-dDashboard-html.txtのようになります。
タスク4:マスター・リストと詳細リストのテスト
-
ターミナル・ウィンドウで、
JET_Web_Application
ディレクトリに移動し、アプリケーションを実行します。$ ojet serve
-
Webブラウザで、アプリの「ベースボール」アクティビティをクリックします。
「アクティビティ」リストの選択によって、
selectedActivityChanged
イベント・ハンドラがトリガーされます。選択したアクティビティに対して「アクティビティ・アイテム」コンテナがレンダリングされます。 -
「アクティビティ・アイテム」リストで、SureCatch Baseball Gloveをクリックします。
「アクティビティ・アイテム」リストの選択によって、
selectedItemChanged
イベント・ハンドラがトリガーされます。アプリケーションによって、選択したアイテムの「アイテム詳細」コンテナがレンダリングされます。 -
「アクティビティ・アイテム」リストで[Ctrl]を押し、SureCatch「Baseball Glove」をクリックして選択を解除します。
「アクティビティ・アイテム」リストの選択解除によって、
selectedItemChanged
イベント・ハンドラがトリガーされます。「アイテム詳細」コンテナは非表示です。 -
ブラウザのサイズを変更するか、Ctrl+Shift+Iを押してChrome DevToolsを起動し、画面サイズ・エミュレータからピクセル5などの小さい画面サイズを選択します。
コンテナは画面サイズに従って配置されます。
-
実行中のWebアプリケーションを表示するブラウザ・ウィンドウまたはタブを閉じます。
-
端末ウィンドウでCtrl+Cを押し、プロンプトが表示されたら
y
と入力してOracle JETツール・バッチ・ジョブを終了します。
タスク5: (オプション)リストアされたアプリケーションからのWebアプリケーションの実行
指定されたコードから完了したOracle JET Webアプリケーションを実行する場合は、ダウンロードしたアーカイブ・ファイルからアプリケーションをリストアできます。ストライプ化および圧縮されたOracle JETアプリケーションを操作するには、抽出したアプリケーション内で、Oracle JETツールや必要なライブラリおよびモジュールなど、プロジェクトの依存関係をリストアする必要があります。
-
jet_web_application_masterdetail_final.zip
ファイルをダウンロードし、完了したアプリケーションのコンテンツをjet_web_application_masterdetail_final
フォルダに抽出します。 -
ターミナル・ウィンドウで、
jet_web_application_masterdetail_final
フォルダに移動し、Oracle JET Webアプリケーションをリストアします。$ ojet restore
-
確認されるまで待ちます。
. . . Success: Restore complete
アプリケーションを実行する準備ができました。
-
Webアプリケーションを実行し、ブラウザでテストします。
$ ojet serve
-
実行中のWebアプリケーションを表示するブラウザ・ウィンドウまたはタブを閉じます。
-
端末ウィンドウでCtrl+Cを押し、プロンプトが表示されたら
y
と入力してOracle JETツール・バッチ・ジョブを終了します。
その他の学習リソース
docs.oracle.com/learnの他のラボを調べるか、Oracle Learning YouTubeチャネルでさらに無料の学習コンテンツにアクセスします。さらに、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerにします。
製品ドキュメントは、Oracleヘルプ・センターを参照してください。
Handle selection events in an Oracle JET web app
F53164-01
February 2022
Copyright © 2022, Oracle and/or its affiliates.