検索結果項目テンプレートの追加
このトピックでは、ユーザーが Visual Studio に付属の検索結果項目テンプレートを使ってアプリ内の情報を検索できるようにする方法を紹介します。検索用の項目テンプレートにより、WinJS.UI.SearchBox コントロールで開始された検索の検索結果ページをアプリで表示することができます。 項目テンプレートについて詳しくは、「JavaScript 項目テンプレート」をご覧ください。ほとんどのアプリで、Microsoft Visual Studio 2013 に含まれている項目テンプレートを使ってアプリ開発を簡略化できます。
検索結果テンプレートは、Windows ストア アプリにお勧めのナビゲーション モデルが実装されたページ コントロールです。このナビゲーション モデルは、ハブ、グリッド、スプリット、ナビゲーションの各プロジェクト テンプレートに実装されています。詳しくは、「ナビゲーション モデル」をご覧ください。
重要 ナビゲーション プロジェクト テンプレートまたは空のプロジェクト テンプレートと組み合わせて検索結果項目テンプレートを使うには、さらにプロジェクト ファイルを追加する必要があります。以下の一覧をご覧ください。
詳しい情報と検索を実装するその他の方法については、「クイック スタート: 検索の追加」をご覧ください。
このトピックでは、ハブ、グリッド、スプリットの各テンプレートに検索結果項目テンプレートを追加する方法について説明します。さまざまなプロジェクト テンプレートに項目テンプレートを追加する際には、次の点にご注意ください。
- 空のテンプレートについては、navigator.js ファイルをプロジェクトに追加します (このファイルは、グリッド テンプレートなどの他のプロジェクト テンプレートから流用できます)。さらに、default.html 内でコンテンツをホストするためのコードを追加する必要があります。詳しくは、「ナビゲーション モデル」をご覧ください。
- ナビゲーション テンプレートと空のテンプレートについては、プロジェクトに data.js を追加するか (グリッド テンプレートなどの他のプロジェクト テンプレートから流用できます)、データにアクセスするための独自のメソッドを実装します。
- ナビゲーション テンプレートと空のテンプレートについては、検索コントロールとそのイベント ハンドラーをテンプレートのホーム ページに追加する必要があります。ナビゲーション テンプレートのホーム ページは、home.html です。空のテンプレートについては、独自のホーム ページを作成するか、default.html を使う必要があります。
検索結果項目テンプレートを追加する
次の手順では、検索結果項目テンプレートをプロジェクト テンプレートに追加する方法を示します。
検索結果項目テンプレートを追加するには
Visual Studio で新しいプロジェクトを作成します。この例では、ハブ テンプレート、グリッド テンプレート、または分割テンプレートを使います。
ソリューション エクスプローラーの pages プロジェクト フォルダーに、search という名前の新しいフォルダーを追加します。
search フォルダーのショートカット メニューを開き、[追加]、[新しい項目] の順にクリックします。
[新しい項目の追加] ダイアログ ボックスの中央のウィンドウで、[検索結果ページ] を選びます。この例では、[名前] ボックスに表示される既定の名前、searchResults.html を使います。
[追加] をクリックします。
Visual Studio で、新しい search フォルダーのプロジェクトに searchResults.html、searchResults.css、searchResults.js が追加されます。
searchResults.js を開き、検索ページの URI が正しいことを確かめます。
var searchPageURI = "/pages/search/searchResults.html";
search フォルダーに検索ファイルを配置しない場合は、URI を更新する必要があります。
searchResults.html を開き、searchResults.css の参照が正しいことを確かめます。
<link href="/pages/search/searchResults.css" rel="stylesheet" />
検索コントロールを追加する (ハブ テンプレート)
ユーザーがアプリ内でデータを検索できるようにするには、WinJS.UI.SearchBox コントロールを使います。これらの手順は、プロジェクト テンプレートごとに異なります。これらの手順は、ハブ テンプレートに適用されます。グリッド テンプレートまたは分割テンプレートを使う場合には、次の「検索コントロールを追加する (グリッド テンプレートおよび分割テンプレート)」をご覧ください。
検索コントロールをページに追加するには
アプリのホーム ページ (hub.html) で、最初の HubSection コントロールの DIV 要素に SearchBox コントロールを追加します。
<div class="hero" data-win-control="WinJS.UI.HubSection"> <div class="searchBox" data-win-control="WinJS.UI.SearchBox"> </div> </div>
ホーム ページの CSS ファイル (hub.css) で、SearchBox コントロールの表示プロパティを指定します。最初のハブ セクションに適用されるルールの後に、次の CSS コードを含めることができます。
.hubpage .hub .hero .win-hub-section-header { display: none; } .hubpage .hub .hero .searchBox { margin-left: 400px; margin-top: 200px; }
ホーム ページの JavaScript ファイル (hub.js) に、onquerysubmitted イベントに対応するイベント リスナーを作成します。ハンドラーによって、SearchBox コントロールからのクエリが取得されます。
ready
関数でリスナーを作成します。この関数のコード コメントでは、初期化コードを追加する必要があることが示されています。// TODO: Initialize the hub sections here. var elem = document.querySelector(".searchBox"); elem.addEventListener("querysubmitted", this.searchHandler.bind(this));
hub.js に、検索結果ページに移動するためのイベント ハンドラーを追加します。
ready
関数と同じスコープ内にイベント ハンドラーを追加します。重要 これがページに定義する最後の関数である場合は、コードからコンマを削除してください。
searchHandler: function (args) { WinJS.Navigation.navigate('/pages/search/searchResults.html', args.detail); },
ヒント 前に示したコードでは、イベント引数の detail プロパティにクエリの情報 (クエリ テキストなど) が含まれています。
ハブ テンプレートの作業を進めるには、次のセクションを省略して、「検索によって返された項目へのナビゲーションを実装する」をご覧ください。
検索コントロールを追加する (グリッド テンプレートおよび分割テンプレート)
ユーザーがアプリ内でデータを検索できるようにするには、WinJS.UI.SearchBox コントロールを使います。これらの手順は、プロジェクト テンプレートごとに異なります。これらの手順は、グリッド テンプレートと分割テンプレートに適用されます。
検索コントロールをページに追加するには
アプリのホーム ページ (グリッド テンプレートの groupedItems.html、分割テンプレートの items.html) で、SearchBox コントロールを追加します。
このコントロールは、ListView コントロールの SECTION 要素の後、ページ フラグメントの DIV 要素の中に置いてください (クラス名として
fragment groupeditemspage
またはfragment itemspage
を使います)。ここに示されたコードはグリッド テンプレートに対応するものです。<section aria-label="Main content" role="main"> <div class="groupeditemslist win-selectionstylefilled" aria-label="List of groups" data-win-control="WinJS.UI.ListView" data-win-options="{ layout: {type: WinJS.UI.GridLayout, groupHeaderPosition: 'top'}, selectionMode: 'none', currentItem: {type: WinJS.UI.ObjectType.item, index: 0, hasFocus: true}, groupDataSource: Data.groups.dataSource, groupHeaderTemplate: select('.headertemplate'), itemDataSource: Data.items.dataSource, itemTemplate: select('.itemtemplate'), ongroupheaderinvoked: select('.pagecontrol').winControl.groupHeaderInvoked, oniteminvoked: select('.pagecontrol').winControl.itemInvoked }"> </div> <div class="searchBox" data-win-control="WinJS.UI.SearchBox" > </div>
ホーム ページの CSS ファイル (groupedItems.css または items.css) で、SearchBox コントロールの表示プロパティを指定します。CSS ファイルの先頭に次の CSS を追加します (テストの後、
margin-left
の値を調整して、検索コントロールがアプリのタイトルの右側に表示されるようにしてください)。ヒント スプリット テンプレートの CSS コードについては、
.groupeditemspage
ではなく.itemspage
ルールを使います。.groupeditemspage .searchBox { margin-left: 600px; margin-top: 70px; }
ホーム ページの JavaScript ファイル (groupedItems.js または items.js) に、onquerysubmitted イベントに対応するイベント リスナーを作成します。ハンドラーによって、SearchBox コントロールからのクエリが取得されます。
ready
関数にイベント リスナーを作成します。var elem = document.querySelector(".searchBox"); elem.addEventListener("querysubmitted", this._searchHandler.bind(this));
groupedItems.js または items.js に、検索結果ページに移動するためのイベント ハンドラーを追加します。
ready
関数と同じスコープ内にイベント ハンドラーを追加します。重要 これがページに定義する最後の関数である場合は、コードからコンマを削除してください。
_searchHandler: function (args) { WinJS.Navigation.navigate('/pages/search/searchResults.html', args.detail); },
前に示したコードでは、イベント引数の detail プロパティにクエリの情報 (クエリ テキストなど) が含まれています。
検索によって返された項目へのナビゲーションを実装する
このセクションでは、ナビゲーションをサポートするように検索結果項目テンプレートを変更します。検索結果項目テンプレートのコードでは、検索結果自体が処理されます。既定の動作は変更できます。たとえば、アプリのデータの種類に応じて _searchData
関数を変更する必要があるとします。既定では、データ モデル内のタイトルとサブタイトルがクエリ文字列と比較されます。この例では、検索条件は変更しません。
注意 _searchData
関数は data.js から提供されたデータを探します。ナビゲーション テンプレートまたは空のテンプレートを使う場合、data.js をプロジェクトに追加するか、利用するデータを検索するメソッドを用意して _searchData
をカスタマイズする必要があります。data.js のデータ モデルについて詳しくは、「プロジェクト テンプレートへのデータの追加」をご覧ください。
この例では、検索クエリで返され、検索結果ページに表示される項目へのナビゲーションを可能にするコードを実装します。
項目へのナビゲーションを追加するには
searchResults.js を開き、
_itemInvoked
関数に、適切なページに移動するためのコードを追加します。このコードは、検索結果ページから検索結果に関連付けられた項目ページへのナビゲーションをサポートします。注意 ここに示された URI はハブ テンプレートに対応するものです。グリッド テンプレートの場合、URI は /pages/itemDetail/itemDetail.html となります。分割テンプレートの場合、URI は /pages/items/items.html となります。
_itemInvoked: function (args) { args.detail.itemPromise.done(function itemInvoked(item) { // TODO: Navigate to the item that was invoked. var itemData = [item.groupKey, item.data.title]; WinJS.Navigation.navigate("/pages/item/item.html", { item: itemData }); }); },
アプリの実行時に検索結果を簡単に確認できるように、data.js の一部の値を変更します。この例では、サンプル データ (
sampleItems
変数) のいくつかのタイトルとサブタイトルを "Hello" と "hloTitle" に置き換えています。次のコードをご覧ください。var sampleItems = [ // . . . { group: sampleGroups[0], title: "Hello", subtitle: "Item Subtitle: 5", description: itemDescription, content: itemContent, backgroundImage: mediumGray }, { group: sampleGroups[1], title: "hloTitle", subtitle: "Hello", description: itemDescription, content: itemContent, backgroundImage: darkGray }, { group: sampleGroups[1], title: "Hello", subtitle: "Item Subtitle: 2", description: itemDescription, content: itemContent, backgroundImage: mediumGray }, // . . . ];
検索をテストする
検索をテストするには
デバッガー ツール バーの [デバッグの開始] の横のボックスの一覧から、[ローカル コンピューター] を選びます。
F5 キーを押してデバッグを開始します。
左側のハブ セクションに表示される検索ボックスに「Hello」と入力して、Enter キーを押します。
検索結果ページに、検索語句が含まれているデータ モデル内の項目が表示されます。 次の図は、検索ボックスに「Hello」と入力した場合の検索結果ページを示しています。
いずれかの検索結果をクリックします。
ハブ、グリッド、分割のいずれかのアプリで項目ページが開き、選ばれたタイトルが最も上に表示されます。
[戻る] ボタンをクリックすると、検索結果ページに戻ることができます。
関連トピック
Windows ストア アプリ用 JavaScript プロジェクト テンプレート