2012-04-25 98 views
1

2つのDataTablesオブジェクトがページにあり、searchResultsTableとcurrentPortfolioTableを呼び出します。私は、ボタンをクリックすると、fnReloadAjaxプラグインを使用してDataTablesをオンデマンドでリロードしています。ただし、テーブルの1つのみが新しいデータ(currentPortfolioTable)をロードしますが、searchResultsTableはデータのajax要求を実行しますが、新しい(有効な)データはテーブルにロードできません。2つのjQuery DataTables - 列の表示/非表示を試みるなど - データテーブルの1つでは失敗しますが、他のデータテーブルでは失敗します

私はDataTableを破壊し、新しいものを作成しようとしました。また、fnReloadAjaxプラグインの一部を書き直して、別の結果が得られるかどうかを確認しました。

fnReloadAjaxだけがcurrentPortfolioTableに対して呼び出された場合でも、読み込まれた新しいデータの表示は拒否されます。

新しいデータのロードに失敗したsearchResultsTableの問題は、DataTableのaoColumnsプロパティのbVisible状態を使用して列の表示/非表示にも発生します。

サンプルコード:

var dataTableObjects = dataTableObjects || { 
    "searchResultsTable": {}, 
    "currentPortfolioTable": {} 
}; 

var _rankingsRootUrl = window.ROOT + 'rankings/'; 

var _defaultDataTableSettings = { 
    "aoColumns": [ 
     { "bSortable": false, 
      "sTitle": "Add to Portfolio", 
      "bVisible": true 
     }, 
     { 
      "bSortable": true, 
      "sTitle": "Name of Investment", 
      "bVisible": true 
     }, 
     { "bSortable": true, 
      "sTitle": "Chart", 
      "bVisible": true 
     }, 
     { "bSortable": true, 
      "sTitle": "Rating", 
      "bVisible": true 
     }, 
     { "bSortable": true, 
      "sTitle": "Minimum", 
      "bVisible": true 
     }, 
     { "bSortable": true, 
      "sTitle": "ROR", 
      "bVisible": false 
     }, 
     { "bSortable": true, 
      "sTitle": "Max DD", 
      "bVisible": false 
     }, 
     { "bSortable": true, 
      "sTitle": "Sharpe", 
      "bVisible": false 
     }, 
     { "bSortable": true, 
      "sTitle": "Sterling", 
      "bVisible": false 
     } 
    ], 
    "aaSorting": [ 
    ], 
    "sAjaxSource": _rankingsRootUrl + 'search_results/', 
    "bServerSide": true, 
    "bProcessing": true, 
    "bPaginate": false, 
    "bLengthChange": false, 
    "sScrollY": 200, 
    "sScrollX": "100%", 
    "sScrollXInner": "100%", 
    "bScrollCollapse": true, 
    "fnServerData": function (sSource, aoData, fnCallback) { 
     $.ajax({ 
      "dataType": 'json', 
      "type": "POST", 
      "url": sSource, 
      "data": aoData, 
      "success": fnCallback 
     }); 
    }, 
    "fnServerParams": function (aoData) { 
     aoData.push(
      {"name": "program_type", "value": $(':input#RankingProgramType').val()}, 
      {"name": "program_name", "value": $(':input#RankingProgramName').val()}, 
      {"name": "min_investment", "value": $(':input#RankingMinimumInvestment').val()}, 
      {"name": "rate_of_return", "value": $(':input#RankingRateOfReturn').val()}, 
      {"name": "max_dd", "value": $(':input#RankingMaxDd').val()}, 
      {"name": "time_span", "value": $(':input#RankingTimeSpan').val()}, 
      {"name": "flags", "value": $(':input#RankingFlags').val()}, 
      {"name": "strategies", "value": $(':input#RankingStrategies').val()}, 
      {"name": "recommended", "value": $(':input#RankingRecommended').val()}, 
      {"name": "portfolio_id", "value": (window.PORTFOLIO && window.PORTFOLIO.id) || ""} 
     ); 
    } 
}; 

var _defaultCurrentPortfolioTableSettings = { 
    "aoColumns": [ 
     { 
      "bSortable": true, 
      "sTitle": "Name of Investment", 
      "bVisible": true 
     }, 
     { "bSortable": true, 
      "sTitle": "Chart", 
      "bVisible": true 
     }, 
     { "bSortable": true, 
      "sTitle": "Rating", 
      "bVisible": true 
     }, 
     { "bSortable": true, 
      "sTitle": "Minimum", 
      "bVisible": true 
     }, 
     { "bSortable": true, 
      "sTitle": "ROR", 
      "bVisible": false 
     }, 
     { "bSortable": true, 
      "sTitle": "Max DD", 
      "bVisible": false 
     }, 
     { "bSortable": true, 
      "sTitle": "Sharpe", 
      "bVisible": false 
     }, 
     { "bSortable": true, 
      "sTitle": "Sterling", 
      "bVisible": false 
     } 
    ], 
    "aaSorting": [ 
    ], 
    "sAjaxSource": _rankingsRootUrl + 'current_portfolio/', 
    "bServerSide": true, 
    "bProcessing": true, 
    "bPaginate": false, 
    "bLengthChange": false, 
    "sScrollY": 200, 
    "sScrollX": "100%", 
    "sScrollXInner": "100%", 
    "bScrollCollapse": true, 
    "fnServerData": function (sSource, aoData, fnCallback) { 
     $.ajax({ 
      "dataType": 'json', 
      "type": "POST", 
      "url": sSource, 
      "data": aoData, 
      "success": fnCallback 
     }); 
    }, 
    "fnServerParams": function (aoData) { 
     aoData.push(
      {"name": "portfolio_id", "value": (window.PORTFOLIO && window.PORTFOLIO.id) || ""} 
     ); 
    } 
}; 

dataTableObjects.searchResultsTable = $('#search-results table').dataTable(_defaultDataTableSettings); 
dataTableObjects.currentPortfolioTable = $('#currently-in-portfolio table').dataTable(_defaultCurrentPortfolioTableSettings); 

$("#rankings").on("click", "a.add", function (e){ 
    dataTableObjects.searchResultsTable.fnReloadAjax('/datable1-url'); 
    dataTableObjects.currentPortfolioTable.fnReloadAjax('/datable2-url'); 
    e.preventDefault(); 
}); 

試み修正:fnReloadAjaxからのコールバックメソッドを使用し

  • 各テーブルのIDが一意であることを確認dataTable2
  • のデータのリロードを発射する
  • dataTableJSObjectsがページの正しいユニークなテーブルであることを確認する
  • コンソールがJShinted JSオフ回さ一切のjsエラーやミス
  • がfnReloadAjax dataTableObjects.searchResultsTableとdataTableObjects.currentPortfolioTableが正常にfnDraw
+0

2番目のテーブルで返されるAJAXの応答は何ですか?予想されるデータかサーバーのエラーですか? – Jeff

+0

期待される有効なデータ。 –

+0

あなたのセレクタが間違っているか、ページに重複した 'id'があるかもしれないということが唯一のことです。 – Jeff

答えて

1

この特定の問題の解決策は、dataTableObjects.currentPortfolioTableのために返されるデータに、データのページ付け、つまりこれがどのデータページであるかにDataTableによって使用される値sEchoが含まれていることでした。 sEchoはexample usage of DataTables with Server Side Dataにあります。

dataTableObjects.currentPortfolioTableのsEcho値は常に1に設定されていたため、DataTableはデータが元のデータセットであり、新しいデータではないと常に考えていました。新しいデータのAJAX要求に返された値にsEchoをインクリメントすると、問題が解決されました。

2
でfnReloadAjaxを使用して置き換え
  • をリロードしません確実にするためにエラーや問題
  • を記録していません

    1つの考えでは、2つの異なるテーブルでfnReloadAjaxを連続して呼び出すと、dataTable1のロードが完了するのを待っても経験しないdataTable2の競合が発生する可能性があります。

    fnReloadAjax機能が役立つことがあり、コールバックパラメータを受け入れ...例えば

    dataTableObjects.dataTable1 = $('#search-results table').dataTable(); 
    dataTableObjects.dataTable2 = $('#currently-in-portfolio table').dataTable(); 
    
    $("#rankings").on("click", "a.add", function (e){ 
        dataTableObjects.dataTable1.fnReloadAjax('/datable1-url', null, reloadDataTable2, false); 
        e.preventDefault(); 
    }); 
    
    // outside of the "ready" block 
    var reloadDataTable2 = function() { 
        dataTableObjects.dataTable2.fnReloadAjax('/datable2-url'); 
    }; 
    

    私はこれをテストしていないので、私はそれが動作することを確かに知っていません。

    しかし、自分の問題の解決策を探しているときにこの質問を見ました。私はこの考えを提供すると考えました。お役に立てれば。

  • +0

    良いアイデアは、テストされ、それは動作しませんでした。 –

    1

    私はちょうどうまくいくはずであることを示す例を一緒に入れました:http://live.datatables.net/aqazek/edit#javascript,html。私はfnReloadAjaxを少し調整して、スタティックデータソース(セルの1つをカウンタで書き直すだけです)にリロードの効果を見せることができますが、DataTablesサイトからの変更はありません。

    私はそれがうまくいかない例を見るために必要な助けを提供すると思います。

    4

    余分なソースコードの詳細を投稿していただきありがとうございます。ちょうど使用し、サーバー側の処理を使用するときにデータを再ロードするには:

    注:私は問題... fnReloadAjaxプラグインの説明では

    を発見したかもしれないと思う、Allan Jardineは、以下の注意事項を追加しました 組み込みAPI関数fnDrawではなく、このプラグインです。今

    、私はあなたがデータを/datable1-url/datable2-urlから要求されていることが確認されてきたことを実感しながら、正しいとfnReloadAjaxを使用したときに最初のデータテーブルも適切にリロードされていること。しかし、アランのメモに照らして、そして問題の神秘的な性質のために、より良い答えが得られないという理由で、あなたの現在の実装の問題は確かにfnReloadAjaxのための適切な解決策ではないと言えます。あなたのテーブルを設定してください。

    私もテーブルが、今まで設定されているとして、単にfnDrawにfnReloadAjaxを変え、あなたの問題を解決するつもりはないこと、しかし、実現...トリッキー取得する時間を...

    ここに私の解決策です

    var isInitialLoadTable1 = true; 
    var isInitialLoadTable2 = true; 
    

    次に、dataTableの設定変数のそれぞれに、fnServerParamsコールバックした後、次の追加のコールバックを追加:::あなたのスクリプトの先頭に次の2行を追加して

    スタート

    "fnInitComplete": function(oSettings, json) { 
        isInitialLoadTable1 = false; 
    } 
    

    trickinessのための今すぐ

    を第二のテーブルにinitialLoadTable2isInitialLoadTable1を変更してください[とfnServerParams :-)のためのエンドブレースの後にカンマを忘れてはいけません] ... fnServerDataにコールバックそのような$.ajaxコールのurl設定変更:この2つの1つのの両方を変更してください、ここでも

    "url": (isInitialLoadTable1 ? sSource : '/datable1-url'), 
    

    を第二のdataTable

    ためのステートメントは、最後に、次のようにあなたのクリックイベントを変更:今すぐ

    $("#rankings").on("click", "a.add", function (e) { 
        dataTableObjects.searchResultsTable.fnDraw(); 
        dataTableObjects.currentPortfolioTable.fnDraw(); 
        e.preventDefault(); 
    }); 
    

    、私はこれをテストしていませんが、実際のテストでは、あなたのコードとデータです。

    うまくいけば、これで問題は解決します。

    +0

    .fnDraw()dを使用すると、searchResultsTableでは動作しますが、currentPortfolioTableでは動作しません。真剣に –

    +0

    ??うわー、私はうんざりです。アランが答えてくれたように、私たちはこれがうまくいかないという例を見なければならないかもしれません...この時点で、私はあなたのコードやマークアップの詳細にどこかにいるはずだと思っています – jimmym715

    関連する問題