web-dev-qa-db-ja.com

AJAXボタンをクリックしたときに、jqueryデータテーブルfnServerDataをトリガーしてテーブルを更新するにはどうすればよいですか?

サーバー側データでdatatablesプラグインを使用しており、AJAXを使用してテーブルを更新しています。

私のdataTablesセットアップは次のようになります:

tblOrders = parameters.table.dataTable( {
    "sDom": '<"S"f>t<"E"lp>',
    "sAjaxSource": "../file.cfc",
    "bServerSide": true,
    "sPaginationType": "full_numbers",  
    "bPaginate": true,
    "bRetrieve": true,
    "bLengthChange": false,         
    "bAutoWidth": false,
    "aaSorting": [[ 10, "desc" ]],      
    "aoColumns": [                      
        ... columns 
                  ],
    "fnInitComplete": function(oSettings, json) {
        // trying to listen for updates
        $(window).on('repaint_orders', function(){
            $('.tbl_orders').fnServerData( sSource, aoData, fnCallback, oSettings );
            });
        },
    "fnServerData": function ( sSource, aoData, fnCallback, oSettings ) {
        var page = $(oSettings.nTable).closest('div:jqmData(wrapper="true")')
        aoData.Push(
            { "name": "returnformat", "value": "plain"},
            { "name": "s_status", "value": page.find('input[name="s_status"]').val() },
            { "name": "s_bestellnr", "value": page.find('input[name="s_bestellnr"]').val() },
            { "name": "form_submitted", "value": "dynaTable" }
            );
        $.ajax({ "dataType": 'json', "type": "POST", "url": sSource, "data": aoData , "success": fnCallback });
        }

AJAXリクエストと一緒にプッシュしている、サーバー側のデータをフィルタリングするためのいくつかのカスタムフィールドがあります。問題は、外部からJSONリクエストをトリガーする方法がわからないことですユーザーがフィルターに入力すると、fnServerDataが起動してテーブルを更新します。ただし、ユーザーがテーブルの外のコントロールを選択した場合、fnServerData関数をトリガーする方法がわかりません。

今私はfnInitCompleteで発生して聞いているカスタムイベントを試しています。カスタムフィルター条件を選択しているユーザーを検出できますが、fnServerDataを正しくトリガーするために必要なすべてのパラメーターがありません。

質問
実際のdataTablesテーブルの外側のボタンからfnServerDataをトリガーする方法はありますか?

フィルターにスペースを追加することはできると思いますが、これは実際にはオプションではありません。

入力ありがとうございます!

質問

18
frequent

私はしばらく前にこのスクリプトを見つけました(そのため、それがどこから来たのか覚えていません:(そして誰がそれを信用するのか: '()しかし、ここでは:

$.fn.dataTableExt.oApi.fnReloadAjax = function (oSettings, sNewSource, fnCallback, bStandingRedraw) {
    if (typeof sNewSource != 'undefined' && sNewSource != null) {
        oSettings.sAjaxSource = sNewSource;
    }
    this.oApi._fnProcessingDisplay(oSettings, true);
    var that = this;
    var iStart = oSettings._iDisplayStart;
    var aData = [];

    this.oApi._fnServerParams(oSettings, aData);

    oSettings.fnServerData(oSettings.sAjaxSource, aData, function (json) {
        /* Clear the old information from the table */
        that.oApi._fnClearTable(oSettings);

        /* Got the data - add it to the table */
        var aData = (oSettings.sAjaxDataProp !== "") ?
            that.oApi._fnGetObjectDataFn(oSettings.sAjaxDataProp)(json) : json;

        for (var i = 0; i < aData.length; i++) {
            that.oApi._fnAddData(oSettings, aData[i]);
        }

        oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
        that.fnDraw();

        if (typeof bStandingRedraw != 'undefined' && bStandingRedraw === true) {
            oSettings._iDisplayStart = iStart;
            that.fnDraw(false);
        }

        that.oApi._fnProcessingDisplay(oSettings, false);

        /* Callback user function - for event handlers etc */
        if (typeof fnCallback == 'function' && fnCallback != null) {
            fnCallback(oSettings);
        }
    }, oSettings);
}

追加[〜#〜] before [〜#〜]データテーブル初期化関数を呼び出します。その後、次のようにリロードを呼び出すだけです。

$("#userFilter").on("change", function () {
        oTable.fnReloadAjax(); // In your case this would be 'tblOrders.fnReloadAjax();'
    });

userFilterはドロップダウンのIDなので、変更されると、テーブルのデータが再ロードされます。これは例として追加したものですが、どのイベントでもトリガーできます。

11
Drakkainen

ディスカッション here から、Allan(DataTablesの人)は、fnDrawを呼び出すだけで目的の結果が得られることを示唆しています。これは私がサーバー側のもの(重要なfnServerDataを介して)をリロードするために使用する方法で、これまでのところ機能しています。

$("#userFilter").on("change", function() {
    oTable.fnDraw();  // In your case this would be 'tblOrders.fnDraw();'
});
18
Chuck

前述のすべての解決策にはいくつかの問題があります(たとえば、追加ユーザーのhttpパラメーターが投稿されていないか、古くなっています)。だから私はうまくいく次の解決策を思いついた。

拡張関数(私のパラメーターはキーと値のペアの配列です)

<pre>
$.fn.dataTableExt.oApi.fnReloadAjax = function (oSettings, sNewSource, myParams ) {
if ( oSettings.oFeatures.bServerSide ) {
    oSettings.aoServerParams = [];
    oSettings.aoServerParams.Push({"sName": "user",
        "fn": function (aoData) {
            for (var i=0;i<myParams.length;i++){
            aoData.Push( {"name" : myParams[i][0], "value" : myParams[i][1]});
         }
     }});
     this.fnClearTable(oSettings);
     this.fnDraw();
     return;
    }
};
</pre>

更新イベントリスナーを配置する使用例。

<pre>
oTable.fnReloadAjax(oTable.oSettings, supplier, val);
</pre>

注意すべきことは1つだけです。テーブルを作成したら、時間がかかるため、テーブルを再描画しないでください。そのため、初回のみ描画してください。それ以外の場合は、再読み込みします

<pre>
var oTable;
if (oTable == null) {
    oTable = $(".items").dataTable(/* your inti stuff here */); {
}else{
    oTable.fnReloadAjax(oTable.oSettings, supplier, val);
}
</pre>
4
Mitja Gustin

私はこれがゲームに遅れていることを知っていますが、fnDraw(from 上記のこの答え -これは受け入れられる答えであるはずです)はv1.10で非推奨になりました

新しい方法は次のとおりです。

this.api( true ).draw( true );

ところで、次のようなコメントがあります。

// Note that this isn't an exact match to the old call to _fnDraw - it takes
// into account the new data, but can hold position.
1
cale_b

初期化で使用:

"fnServerData": function ( sSource, aoData, fnCallback ) {
                    //* Add some extra data to the sender *
                    newData = aoData;
                    newData.Push({ "name": "key", "value": $('#value').val() });

                    $.getJSON( sSource, newData, function (json) {
                        //* Do whatever additional processing you want on the callback, then tell DataTables *
                        fnCallback(json);
                    } );
                },

そして、次のように使用します:

$("#table_id").dataTable().fnDraw();

FnServerDataで重要なことは次のとおりです。

    newData = aoData;
    newData.Push({ "name": "key", "value": $('#value').val() });

aoDataに直接プッシュする場合、変更は初めて永続的であり、テーブルを再度描画すると、fnDrawは希望どおりに機能しません。したがって、aoDataのコピーを使用してデータをajaxにプッシュします。

1
laromicas

データをリロードするには、DataTable()関数でjqueryセレクターを使用してDataTableを選択し、_fnAjaxUpdate関数を呼び出すだけです。

次に例を示します。

$('#exampleDataTable').DataTable()._fnAjaxUpdate();
0
Brane

ミチャ・ガスティンの答えに似ています。ループを変更し、sNewSourceを追加しました。

$.fn.dataTableExt.oApi.fnReloadAjax = function (oSettings, sNewSource, myParams ) {
    if(oSettings.oFeatures.bServerSide) {
        if ( typeof sNewSource != 'undefined' && sNewSource != null ) {
            oSettings.sAjaxSource = sNewSource;
        }
        oSettings.aoServerParams = [];
        oSettings.aoServerParams.Push({"sName": "user",
            "fn": function (aoData) {
                for(var index in myParams) {
                    aoData.Push( { "name" : index, "value" : myParams[index] });
                }
            }
        });
        this.fnClearTable(oSettings);
        return;
    }
};

var myArray = {
    "key1": "value1",
    "key2": "value2"
};

var oTable = $("#myTable").dataTable();
oTable.fnReloadAjax(oTable.oSettings, myArray);
0
Tomasz Majerski