2017-02-08 9 views
0

私は、誰かが私に次のように達成するための指針を与えることができることを期待していました。再帰的なAjaxクエリ

  • A JS機能:jQueryのAJAXクエリのSharePointのカスタムリストから項目を取得します

    現在、私が持っています。

  • JS関数:リスト結果をデータテーブルに格納します。

  • InitatorIdをユーザーの実際の名前(GetDisplayName)に変換できるJS関数。

    function GetDisplayName(userid) { 
    var requestUri = _spPageContextInfo.webAbsoluteUrl + "/_api/web/getuserbyid(" + userid + ")"; 
    
    var requestHeaders = { "accept" : "application/json;odata=verbose" }; 
    
    $.ajax({ 
        url : requestUri, 
        contentType : "application/json;odata=verbose", 
        headers : requestHeaders, 
        success : GetDisplayNameSuccess, 
        error : GetDisplayNameFail 
        }); 
    } 
    
    
        function populateMyOutstandingItems() { 
    
         SP.SOD.executeFunc("sp.js", "SP.ClientContext", function() { 
         SP.SOD.executeFunc("sp.runtime.js", "SP.ClientContext", function() { 
          var context = SP.ClientContext.get_current(); 
          var queryUrl = "https://companyname.sharepoint.com/subsite/_api/Web/Lists/getbytitle('Read%20Requests')/GetItems"; //change the Url 
          var camlXML = "<Query><Where><And><Eq><FieldRef Name='ReaderId' LookupId='True' /><Value Type='Integer'>" + _spPageContextInfo.userId + "</Value></Eq><Neq><FieldRef Name='Read' /><Value Type='Text'>YES</Value></Neq></And></Where></Query>" 
    
          var requestData = { "query" : 
           {"__metadata": 
            { "type": "SP.CamlQuery" } 
            , "ViewXml": camlXML 
           } 
          }; 
    
          return jQuery.ajax({ 
          url: queryUrl, 
          type: "POST", 
          data: JSON.stringify(requestData), 
          headers: { 
           "X-RequestDigest": $("#__REQUESTDIGEST").val(), 
           "Accept": "application/json; odata=verbose", 
           "Content-Type": "application/json; odata=verbose" 
          }, 
          success: onQuerySuccessMyOutstandingItems, 
          error: onQueryErrorMyOutstandingItems 
          }); 
         }); 
         }); 
    } 
    
    function onQuerySuccessMyOutstandingItems(data) { 
    var jsonData = data.d.results 
    console.log(jsonData) 
    $("#resultsDivMyOutstandingItems").dataTable({ 
        "data" : jsonData, 
        columns: [ 
         { data: "Document_x0020_Name" }, 
         { data: "Document_x0020_Library_x0020_Nam" },   
         { data: "Request_x0020_Made_x0020_Date" }, 
         { data: "InitatorId" }, 
         { data: "Request_x0020_ReadBy_x0020_Date" }, ], 
          order: [[3, "asc"]] 
    }); } 
    

瞬間、DataTableの、私はInitatorID(すなわち30)を持っているが、私は、テーブル内のユーザーの本当の名前を持っていると思います。

再帰的なAJAXクエリが必要になると理解していますが、これを達成するための最善の方法が何であるか分かりませんし、誰かが私を正しい方向に向けることを期待していました。

チェーンの要求について少し読んだ後、私は以下のコードを試してみましたが、Chromeは「予想外の結末」を訴えているので、それは、私は推測間違っている:達成することが最善であるものを、要するに

 var request = $.ajax({ 
     url: queryUrl, 
     type: "POST", 
     data: JSON.stringify(requestData), 
     headers: { 
      "X-RequestDigest": $("#__REQUESTDIGEST").val(), 
      "Accept": "application/json; odata=verbose", 
      "Content-Type": "application/json; odata=verbose" 
       } 
     }), 
     chained = request.then(function(data) { 
      return $.ajax(spPageContextInfo.webAbsoluteUrl + "/_api/web/getuserbyid(" + data.InitatorId + ")", 
      { data: { user: data.Title }}) 
     }); 

     chained.done(function(data) { 
      console.log(data) 
     }); 

は、私は何をしようとしていますか?

感謝 グレン

答えて

0

私は(私が間違っているなら、私を修正してください)

  1. が作るので、ここで私の最高の推測では、シナリオでだ、私は完全にあなたが求めているものを理解してわかりませんSharePointカスタム リストから項目のリストを取得するためにAJAXを呼び出しますが、このリストの列の1つにユーザー名の代わりにInitatorIDがあります。
  2. これを修正するために、今検索したInitatorIDの一致するセットのユーザー名のリストを取得する別のAJAX呼び出しを作成します。
  3. これを取得したら、データを表示するためにdataTableに格納します。

詳細を知らないうちに、ネストされたAJAX呼び出しを実行します。基本的に、最初の呼び出しが完了したら、2番目のAJAX関数を呼び出します。これが完了したら、dataTableを更新します。ような何か:

$.ajax({ 
    url: MY_FIRST_URL, 
    data: myFirstData 
}).done(function (data) { 
    // The first call gets completed after some time and the 'done' function is called. 
    // here, extract the various InitatorID values, and pass them to the 
    // second AJAX call, so you can then get the usernames for those Ids 

    var initatorIds = // ... do data massaging here to get the initatorIds 
         // into the format you want from the 'data' variable 
        // passed in the done function... 

    $.ajax({ 
     url: MY_SECOND_URL, 
     data: initatorIds 
    }).done(function (data2) { 
     // once the SECOND call is complete, populate the dataTables 

     var jsonData = // ... some manipulation of data and data2 results 
         // to get the combined output you want. 

     $("#resultsDivMyOutstandingItems").dataTable({ 
       "data" : jsonData, 
       columns: [ 
       .... 
       .... 
     }); 
    }).fail(function (jqXHR, textStatus) { 
     // do stuff if the second call fails 
    }); 
}).fail(function (jqXHR, textStatus) { 
    // do stuff if the first call fails 
}); 

および過複雑ソリューションのリスクが、私は個人的にdataTableのプラグイン内で見つかったAjax機能を経由して直接テーブルにデータをロードするために見てね(そのhereについての詳細を読みます) 。しかし、間違いなくそれが上記のようにレイアウトする混乱を最小限に抑えたら、まずそれをしてください!

+0

よろしくお願いいたします。私は入れ子にされたajaxの考えを使用しました。私は今夜​​私の完全な解決策を投稿します。 – Glen226

+0

うまくいけば助けてくれた!それが実際にあなたを助けた場合、答えを正しいとマークし、コードに幸運を覚えておいてください! – CrackAttack