datatable lib 적용 (2020)
2022, Aug 26
jquery datatable
ℹ️ 1.10.20버전 기준
요구사항
- 2개의 테이블로 구분
- 각 row에 dropdown 제공
- 리스트 검색
- 컬럼별 정렬 제공
개발
- 라이브러리를 검색하다가 datatable 발견해서 간단하게 청사진(?)을 그려본 담에 내부 검토를 거쳐서 적용하게 되었습니다.
- 적용하면서 라이브러리에 대해 정리한 것들입니다.
1. datatable생성되고 로드되고 콜백 정의
datatable({
stateLoadCallback: function(settings) {
return true; // 리턴 반드시 정의(리턴 빠지면 생성안됨)
}
})
2. row항목별 클릭이벤트 정의
datatable({
fnRowCallback: function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) {
$('td > i', nRow).on('click', function() {
// if you have the property "data" in your columns, access via aData.property_name
// if not, access data array from parameter aData, aData[0] = data for field 0, and so on...*
var btnAction = $(this).data('toggle');
if (btnAction === 'dropdown'){
// $(this).trigger('click');
$(this).closest('div').find('.subMenu').addClass('open');
} else if (btnAction === 'appdetail'){
// do something......
}
});
}})
3. row별로 속성주기
var aaa = new Datatable();
aaa.rows().every( function () {
this.child( this.index() );
} );
4. class속성 변경
$.extend( $.fn.dataTableExt.oStdClasses, {
"sFilterInput": "form-control" // 필터영역에 className 정의
});
5. row 빼기
$.fn.dataTable.ext.search.push(
function(settings, data, dataIndex) {
alert(data[1] == " ");
return data[1] == " ";
}
);
aaa.draw();
6. row빼기 - 2
// (3)으로 child주고 하고 나서
var bb = $('#listViewTableY tbody');
var child = aaa.row( bb ).child;
if ( child.isShown() ) {
child.hide();
}
else {
child.show();
}
7. 테이블 그려질 때 디폴트로 특정 컬럼으로 sorting되게
order: [[3, 'desc']], // 4번째 컬럼으로 descending되게 한다.
datatables가 생성되었는지 체크하는 방법
if (table instanceof $.fn.dataTable.Api) { // datatable ... do datatable stuff } else { // not a datatable... do other stuff }
OR
*$*.**fn**.dataTable.isDataTable(**'#listViewTableMain'**)
8. get row data
columnDefs : [{targets:0, width:'33%'}, {targets:1, width:'10%'}, {targets:2, width:'27%'}, {targets:3, width:'15%'}, {targets:4, width:'14%', sortable: false}, {targets:[5, 6], width:'1%', visible: false}],
columns: [
{ "data": "scenarioName" },
{ "data": "status" },
{ "data": "description" },
{ "data": "updatedDate" },
{ "data": "applyBtn" },
{ "data": "scenarioId" },
{ "data": "isMain" }
],
alert(loadedDatatable.rows( { selected: true } ).data()[0].scenarioId);
<th class="hide"></th>
<th class="hide"></th>
<td class="hide"></td>
<td class="hide"></td>
기타. 로딩이 느려서 테스트해 본 옵션들
- fixedHeader : true로 하면 헤더는 고정되지만 약간 느린것 같음
- stateSave : true로 하면 마지막 정렬조건이라든지 마지막 설정을 저장해서 가져오고 있어서 좋지만, 느린것 같음
- columnDefs: 컬럼별로 설정이 많을 수록 느림
- responsive: true로 하면 느림