2011-11-23 42 views
13

Tóm tắtDữ liệu về jQuery: Làm cách nào để thêm ID hàng vào mỗi hàng được thêm động?

Tôi đang sử dụng plugin jQuery dataTables tuyệt vời từ http://www.datatables.net. Trong tập lệnh của tôi, tôi tự động thêm hàng dựa trên sự kiện kích hoạt bằng cách sử dụng fnAddData. Sử dụng fnRowCallback, tôi thêm vào một ID hàng duy nhất. Điều này đôi khi không thành công và không thêm ID hàng. Trong thử nghiệm có 46 hàng bổ sung, thường từ 6 đến 8 hàng không nhận được ID hàng.


chức năng Add Row

function ps_ins(row) 
{ 
    var rowArray = row.split('|'); 
    row = rowArray; 
    var alarmID = parseInt(row[1],10); 

    $('#mimicTable').dataTable().fnAddData([ 
    alarmID, 'col2', 'col3', 'col4', 
    'col5', 'col6', 'col7' 
    ]); 
} 

Hàng được bổ sung vào bảng một cách chính xác. Bài kiểm tra tôi đang chạy thêm 46 hàng và tất cả xuất hiện như mong đợi.


Thêm ID hàng

Tôi cố gắng để thêm một ID duy nhất cho mỗi hàng vì vậy tôi sau này có thể sửa đổi một hàng cụ thể và đề cập đến nó trong bộ nhớ cache DataTable bằng cách sử dụng một sự kết hợp của fnGetRows và .filter .

Tôi đang làm điều này bằng cách sử dụng fnRowCallback trong giai đoạn khởi tạo. Tôi đã giữ tất cả các cài đặt khác chỉ trong trường hợp có bất kỳ điều gì có thể ảnh hưởng đến sự cố.

$('#mimicTable').dataTable({ 
    "sDom": 'lip<"mimicSpacer">f<"numUnAck">rt', 
    "sScrollY": "365px", 
    "aaSorting": [[4,'desc'],[5,'desc']], 
    "iDisplayLength": 15, 
    "aLengthMenu": [[15, 50, 100, -1], [15, 50, 100, 'All']], 
    "bAutoWidth": false, 
    "aoColumns": [ 
     null, 
     { "sWidth": "20%" }, 
     { "sWidth": "22%" }, 
     { "sWidth": "9%" }, 
     { "sWidth": "9%" }, 
     { "sWidth": "20%" }, 
     { "sWidth": "20%" } 
    ], 
    "fnRowCallback": function(nRow, aData, iDisplayIndex, iDisplayIndexFull) { 
     $(nRow).attr("id",'alarmNum' + aData[0]); 
     return nRow; 
    } 
    }); 

Một console.log của đối tượng DataTable cho thấy: missing row ids

Như bạn thấy, # 14 có id hàng và cũng là lớp rowStripe đúng. # 15 (và trở đi) thì không.

Vì vậy, tại sao fnRowCallback không kích hoạt mỗi khi một hàng được thêm vào, chỉ đôi khi? Có thể có cách nào tốt hơn để thêm ID hàng khi hàng được thêm vào?

+0

Cuộc gọi lại có chắc chắn không hoạt động không? Bạn đã thử đăng nhập giá trị của nRow trong hàm 'fnRowCallback' chưa? –

+0

Xin chào Phil, fnRowCallback dường như được gọi nhiều lần nên khó có thể nhận được 46 hàng đầu ra để xem những gì đang xảy ra. – psynnott

+0

người dùng muốn xem jsfiddle nếu họ trả lời các câu hỏi phức tạp hơn (nếu không cần phải phân tích cho họ và họ cứ tiếp tục với câu hỏi tiếp theo) – noob

Trả lời

27

Tìm thấy giải pháp: http://www.datatables.net/forums/discussion/2119/adding-row-attributes-after-fnadddata/p1

Đối với bất cứ ai khác muốn một giải pháp nhanh chóng, tôi đã làm:

var addId = $('#mimicTable').dataTable().fnAddData([ 
    alarmID, 
    'col2', 
    'col3', 
    'col4', 
    'col5' 
]); 

var theNode = $('#mimicTable').dataTable().fnSettings().aoData[addId[0]].nTr; 
theNode.setAttribute('id','alarmNum' + alarmID); 
+0

addId là gì [0]? – vlio20

+2

addId được định nghĩa ở trên. Từ tài liệu, fnAddData trả về một mảng các số nguyên, đại diện cho danh sách các chỉ mục trong aoData đã được thêm vào bảng. Vì chúng ta chỉ thêm một hàng, sau đó nó trả về chỉ số được thêm vào. – psynnott

1

Có gì đó bất ngờ với mã của bạn trong jsbin, ngay cả khi nó dường như là đang làm việc. Nó khởi tạo với bộ dữ liệu "trình duyệt". Sau đó, nó xóa. Sau đó, nó làm cho một bảng mới với một hàng. Sau đó, nó xóa. Sau đó, nó làm cho một bảng mới với hai hàng. Sau đó, nó xóa. Sau đó, nó làm cho một bảng mới với ba hàng.

Tôi phải hiểu rõ hơn về mẫu mã và mục tiêu cuối cùng của nó (và sự chú ý của tôi được chuyển hướng ở nơi khác ngay bây giờ) nhưng bạn nên biết rằng fnRowCallback NÊN là cách để làm điều này, và ở đó là nhiều công trình xây dựng bảng dự phòng và bổ sung hàng sẽ tác động đến hiệu suất cũng như tính linh hoạt với việc sửa đổi hiển thị trong tương lai.

+0

cảm ơn câu trả lời của bạn, nhưng hãy xem câu trả lời tôi đã đăng. Nó hoạt động :) Hiệu suất xuất hiện để được ok, nhưng tôi sẽ làm bài kiểm tra thêm. – psynnott

+0

Bạn đã gấp mã cập nhật vào jsbin chưa? Tôi cũng tò mò muốn nói đùa. Tôi có thể giúp bạn tìm bất kỳ sự bất thường nào. –

4

Tôi biết đây là một chủ đề cũ nhưng điều này có thể giúp người khác. Cách đơn giản nhất tôi làm điều đó để thêm thuộc tính id vào hàng bổ sung mới nhất ngay sau khi tôi gọi là chức năng bảng dữ liệu fnAddData là:

$('#table').dataTable().fnAddData(['col1','col2','col3']);  

$('#table tr:last').attr('id','col'+row_id); 
+2

nếu kích thước dữ liệu bạn đang thêm lớn hơn số hàng bạn hiển thị trong một trang. điều này sẽ không hoạt động. – Jia

+0

Đây chính là lý do tại sao tôi yêu stackOverflow ... cảm ơn bạn! – Fergus

2

Hãy thử điều này nó làm việc cho tôi độc đáo:

var newRow = oTable.fnAddData([ etc..]); 
var oSettings = oTable.fnSettings(); 
var nTr = oSettings.aoData[ newRow[0] ].nTr; 
nTr.id = 'new id'; 
1

bạn có thể sử dụng DT_RowId khi bạn thêm hàng mới, và sử dụng đối tượng thay vì một mảng, xem dưới đây:

$('#mimicTable').dataTable().fnAddData({ 
      'DT_RowId': alarmID, 0:'col2', 1:'col3', 2:'col4', 
      3:'col5', 4:'col6', 5:'col7' 
     }); 
+2

Bạn nên luôn giải thích câu trả lời của mình thay vì chỉ dán một khối mã – Gary

+0

Nhìn xung quanh mãi mãi trước khi tôi thấy đoạn mã này đã giúp tôi tìm ra lỗi khó hiểu mà tôi đã nhận được. Cám ơn vì cái này! – Brendan

0

này làm việc cho tôi

var MyUniqueID = "tr123"; // this is the uniqueId. 
var rowIndex = $('#MyDataTable').dataTable().fnAddData([ "column1Data", "column2Data"]); 
var row = $('#MyDataTable').dataTable().fnGetNodes(rowIndex); 
$(row).attr('id', MyUniqueID); 
Các vấn đề liên quan