0

私は DataTables テーブルを持っています:

  %table.table.datatable#datatable
    %thead
      %tr
        %th Name
    %tbody
      - @cars.each do |car|
        %tr
          %td
            = car.name

そして、以下に基づく Jeditable コード: http://datatables.net/release-datatables/examples/api/editable.html

:javascript
$(document).ready(function() {
    /* Init DataTables */
    var oTable = $('#datatable').dataTable();

    /* Apply the jEditable handlers to the table */
    oTable.$('td').editable( 'update', {
        "callback": function( sValue, y ) {
            var aPos = oTable.fnGetPosition( this );
            oTable.fnUpdate( sValue, aPos[0], aPos[1] );
        },
        "submitdata": function ( value, settings ) {
            return {
                "row_id": this.parentNode.getAttribute('id'),
                "column": oTable.fnGetPosition( this )[2]
            };
        },
        "height": "14px",
        "width": "100%"
    } );
} );

ページの読み込み時に次のエラーが表示されます。

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

これを前に追加します。var oTable = $('#datatable').dataTable();

    $('#datatable').dataTable({   
      "bRetrieve":true,
      "bDestroy":true
    });

ただし、私のテーブルはまだ編集できません!

4

1 に答える 1

1

私は当初、問題は HAML にあると考えていました。DataTables は、独自の「dataTable」クラスをテーブルに適用します。これにより、テーブルが既に初期化されていると思われる可能性があります。

jEditable の例のページ ソースから、DataTables がテーブルを初期化するときに「dataTable」クラスをテーブルに追加することがわかります。

<table cellpadding="0" cellspacing="0" border="0" class="display dataTable" id="example" aria-describedby="example_info">
</table>

次のようにテーブルを初期化するだけで済みました。

var oTable = $('#example').dataTable();

クラス「datatable」をテーブルに追加すると、DataTableが混乱し、再初期化について不平を言う可能性があると思いました。しかし、jsFiddle で簡単にテストしたところ、そうではないようです。(明らかに) 投稿エラーが発生しますが、初期化エラーは発生しません。

私が作成したフィドルはこちらです。

それでも、テーブルで必要なのは「dataTable」IDだけです。

あなたの「修正」は実際には問題に対処していません。行 6390 付近の DataTables (v1.9.4) ソースを見ると、bDestroy フラグによって、以前に初期化された DataTable インスタンスが破棄されることがわかります。

/* Base check on table node */
if ( DataTable.settings[i].nTable == this )
{
   if ( oInit === undefined || oInit.bRetrieve )
   {
      return DataTable.settings[i].oInstance;
   }
   else if ( oInit.bDestroy )
   {
      DataTable.settings[i].oInstance.fnDestroy();
      break;
   }
   else
   {
      _fnLog( DataTable.settings[i], 0, "Cannot reinitialise DataTable.\n\n"+
         "To retrieve the DataTables object for this table, pass no arguments or see "+
         "the docs for bRetrieve and bDestroy" );
         return;
   }
}

これにより、以前に初期化されたテーブルがクリアされ、エラー メッセージが消えます。しかし、それは問題を解決しません(あなたが述べたように)。

このテーブルに別の ID を使用してみて (「#editableTable」などと呼んでください)、問題が解決するかどうかを確認してください。存在する場合は、同じ IDまたはクラスを持つ別の初期化されたテーブルがあります。そうでないことを確認しても初期化エラーが引き続き発生する場合は、問題を引き起こしている可能性のある pjax またはターボリンクを使用していないことを確認します。

于 2013-08-29T05:55:29.203 に答える