1

私のWin8アプリでは、空白のテンプレートに基づいて、検索コントラクトを正常に追加しました。まだデータにリンクしていないにもかかわらず、機能しているようです。そのため、今のところ、アプリで任意の用語を検索すると「結果が見つかりません」というメッセージが表示されたsearchResultsページに移動するだけです。これは、最初に期待していたことです。

ここで、データベースをsearchResults.jsファイルにリンクして、データベースにクエリを実行できるようにします。検索契約の範囲外で、Dbをテストして接続しましたが、機能します。を使用してこれをWinJS.xhr実行し、Webサービスに接続します。Webサービスはデータベースにクエリを実行し、JSONオブジェクトを返します。

私のテストでは、URLをハードコーディングしただけですが、2つのことを行う必要があります。DBを検索コントラクトコードに接続するためのテストWinJS.xrデータを移動し、次に、ハードコードされたURLをユーザーの検索用語を受け入れる動的URLに変更します。

これまでのところ、Win 8検索について私が理解していることから、検索契約の実際のデータクエリ部分は次のとおりです。

// This function populates a WinJS.Binding.List with search results for the provided query.
    _searchData: function (queryText) {
        var originalResults;
        // TODO: Perform the appropriate search on your data.
        if (window.Data) {
            originalResults = Data.items.createFiltered(function (item) {
                return (item.termName.indexOf(queryText) >= 0 || item.termID.indexOf(queryText) >= 0 || item.definition.indexOf(queryText) >= 0);
            });
        } else {`enter code here`
            originalResults = new WinJS.Binding.List();
        }
        return originalResults;
    }
});

このセクションに転送する必要のあるコードは次のとおりです。今、私は現在上記のコードブロックを理解しておらず、それを行ごとに分類するための適切なリソースを見つけていないことを認めなければなりません。それは本当に素晴らしいでしょうが、誰かが助けることができれば!以下の私のコードは、基本的にそれを統合してから、searchStringをユーザーの検索語と等しくしたいと思っています。

   var testTerm = document.getElementById("definition");
    var testDef = document.getElementById("description");

    var searchString = 2;
    var searchFormat = 'JSON';

    var searchurl = 'http://www.xxx.com/web-service.php?termID=' + searchString +'&format='+searchFormat;

    WinJS.xhr({url: searchurl})
      .done(function fulfilled(result)

      {
          //Show Terms                 
          var searchTerm = JSON.parse(result.responseText);

          // var terms is the key of the object (terms) on each iteration of the loop the var terms is assigned the name of the  object key
          // and the if stament is evaluated

          for (terms in searchTerm) {

              //terms will find key "terms"
              var termName = searchTerm.terms[0].term.termName;
              var termdefinition = searchTerm.terms[0].term.definition;

              //WinJS.Binding.processAll(termDef, termdefinition);
              testTerm.innerText = termName;
              testDef.innerText = termdefinition;
          }              
    },
              function error(result) {
                  testDef.innerHTML = "Got Error: " + result.statusText;
              },
              function progress(result) {
                  testDef.innerText = "Ready state is " + result.readyState;
              });          
4

1 に答える 1

1

あなたがよく理解していなかったスニペットについて、いくつかの説明を提供しようとします。上記のコードは、Visual Studio によって追加された既定のコードから来ていると思います。行内のコメントとして説明を参照してください。

/**
 * This function populates a WinJS.Binding.List with search results 
 * for the provided query by applying the a filter on the data source
 * @param {String} queryText - the search query acquired from the Search Charm
 * @return {WinJS.Binding.List} the filtered result of your search query.
 */
_searchData: function (queryText) {
    var originalResults;
    // window.Data is the data source of the List View 
    // window.Data is an object defined in YourProject/js/data.js
    // at line 16 WinJS.Namespace.define("Data" ...
    // Data.items is a array that's being grouped by functions in data.js
    if (window.Data) {
        // apply a filter to filter the data source
        // if you have your own search algorithm, 
        // you should replace below code with your code
        originalResults = Data.items.createFiltered(function (item) {
            return (item.termName.indexOf(queryText) >= 0 ||
                    item.termID.indexOf(queryText) >= 0 || 
                    item.definition.indexOf(queryText) >= 0);
            });
    } else {
        // if there is no data source, then we return an empty WinJS.Binding.List
        // such that the view can be populated with 0 result
        originalResults = new WinJS.Binding.List();
    }
    return originalResults;
}

独自の Web サービスで検索を行うことを考えているので、いつでも_searchData関数を非同期にして、Web サービスから返される検索結果をビューで待機させることができます。

_searchData: function(queryText) {
    var dfd = new $.Deferred();
    // make a xhr call to your service with queryText
    WinJS.xhr({
        url: your_service_url,
        data: queryText.toLowerCase()
      }).done(function (response) {
           var result = parseResultArrayFromResponse(response);
           var resultBindingList = WinJS.Binding.List(result);
           dfd.resolve(result)
      }).fail(function (response) {
          var error = parseErrorFromResponse(response);
          var emptyResult = WinJS.Binding.List();
          dfd.reject(emptyResult, error);
      });
    return dfd.promise();
}
...
// whoever calls searchData would need to asynchronously deal with the service response.

_searchData(queryText).done(function (resultBindingList) {
    //TODO: Display the result with resultBindingList by binding the data to view
}).fail(function (resultBindingList, error) {
    //TODO: proper error handling
});
于 2012-12-20T07:25:21.807 に答える