25

グリッド内のデータを表示するためにjqueryデータテーブルを使用しています。initページロードスクリプトでDateTime.Todayを取り、それらをさらに処理します。問題は、initページロード後、ユーザーが入力した日付をさらに処理しようとしているときに発生します。次のエラーが発生しました。

DataTables警告(テーブルID ='dataTable'):DataTableを再初期化できません。このテーブルのDataTablesオブジェクトを取得するには、引数を渡さないか、bRetrieveとbDestroyのドキュメントを参照してください

function getDate() {
    var date = $('input[name="myDate"]').val();
    return date;
}

$('#myDate').click(updateDate);

function updateDate() { 
    $('#dataTable').dataTable({
        "bServerSide": true,
        "sAjaxSource": "/Home/Ajax",
        "fnServerParams": function (aoData) {
            var date = getDate();
            aoData.push({ "name": "myDate", "value": date });
        },
        //... there's more
}

updateDate();

スクリプトはページの下部に配置されます。

4

9 に答える 9

57

「bDestroy」を追加してみてください:オプションオブジェクトリテラルにtrue、例:

$('#dataTable').dataTable({
    "bServerSide": true,
    ....
    "bDestroy": true
});
于 2012-09-17T07:05:54.883 に答える
13

私はこれが古い質問であることを知っています。しかし、これは同様の問題を抱えている他の人のためのものです。

古いdataTableの割り当てを破棄する必要があります。新しいデータテーブルを作成する前に、次のコードを使用してください

$("#dataTable").dataTable().fnDestroy();
于 2014-01-14T00:21:16.000 に答える
12

DataTables APIが変更されましたが、データテーブルを再初期化しようとすると、このエラーがスローされます。

次のコマンドですでに作成されているかどうかを確認できます。

$.fn.DataTable.isDataTable("#myTable")

そして、それを破壊して、再び再作成できるようにします。

$('#myTable').DataTable().clear().destroy();

これは最も効率的な方法ではありませんが、機能します。clearとを使用するだけで、最初にテーブルを破棄せずにテーブルを更新できるはずですがrow.add、データソースがコンストラクターに渡される配列である場合、それを行う方法が見つかりませんでした。

于 2014-07-08T12:40:25.783 に答える
3

最初にやりたいことは、データテーブルをクリーンアップして破棄することです。

var tables = $.fn.dataTable.fnTables(true);

$(tables).each(function () {
  $(this).dataTable().fnClearTable();
  $(this).dataTable().fnDestroy();
});

その後、再作成します。

$("#datagrid").dataTable();
于 2014-01-29T17:52:25.023 に答える
1

コード内にデータテーブルへの重複した呼び出しがあるかどうかを確認してください。誤ってテーブルを複数回初期化すると、まさにこのエラーが返されます

于 2013-09-17T21:42:39.253 に答える
0

新しいDatatablesAPIには、最初にテーブルを破棄しなくてもajaxソースからデータを再度取得するリロード関数があります。多数の行(5000以上)のテーブルがある場合、破棄には初期ロードよりも時間がかかります。さらに、破棄時に「処理」ボックスは表示されませんが、リロードは非常に高速で、「処理中」が正しく表示されます。 「動作中のボックス。

これは、新しいAPIを使用して目的の効果を実現する質問のコードの更新バージョンです。

function getDate() {
  var date = $('input[name="myDate"]').val();
  return date;
}

$('#myDate').click(updateDate);

// Use .DataTable instead of .dataTable
// It returns a different object that has the ajax attribute on it.
var myDataTable = $('#dataTable').DataTable({
  "bServerSide": true,
  "sAjaxSource": "/Home/Ajax",
  "fnServerParams": function (aoData) {
    var date = getDate();
    aoData.push({ "name": "myDate", "value": date });
  },
  //... there's more

function updateDate() { 
  myDataTable.ajax.reload();
}

私が行った唯一の変更は、.DataTableの代わりにを使用.dataTableし、戻り値への参照を維持して、myDataTableを呼び出すために使用できるようにすること.ajax.reload()です。

于 2014-10-03T14:50:32.070 に答える
0

これは私にとってはうまくいきましたvartable= $('#table1')。DataTable({destroy:true、response:true、.....});

于 2019-07-11T11:47:53.267 に答える
-1

既存のdataTableをクリアします。

$(this).dataTable().fnClearTable();
$(this).dataTable().fnDestroy();
于 2016-02-15T10:19:11.987 に答える
-2
var myDataTable = $('#dataTable').DataTable();
myDataTable.ajax.reload();

絶対にこれが私が探しているものです。datatテーブルを再初期化するための素晴らしいソリューション

于 2016-10-18T10:25:40.310 に答える