๊ธฐ๋ณธ Basics
์ ๋ ฌยทํํฐยท์ ํยทํ์ด์ง๋ค์ด์ โ ๋๋ถ๋ถ์ ๊ทธ๋ฆฌ๋๊ฐ ๊ฐ์ฅ ๋จผ์ ํ์๋ก ํ๋ ๊ฒ๋ค.
Sorting
ํค๋ ํด๋ฆญ์ผ๋ก ์ค๋ฆ์ฐจ์ โ ๋ด๋ฆผ์ฐจ์ โ ํด์ ์ํ. Shift+ํด๋ฆญ์ผ๋ก ๋ค์ค ์ ๋ ฌ(์ ๋ ฌ ์์ ๋ฐฐ์ง ํ์).
sortModel๋ก ์ด๊ธฐ ์ ๋ ฌ์ ์ง์ ํ ์ ์์ต๋๋ค.
Column Filters
ํค๋์ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ฆฌ๋ฉด ๋ํ๋๋ ๋ฉ๋ด ๋ฒํผ์ผ๋ก ์ปฌ๋ผ๋ณ ํํฐ๋ฅผ ์ฝ๋๋ค.
filter: 'text' ยท 'number' ยท
'set'. ์ฌ๋ฌ ์ปฌ๋ผ ํํฐ๋ AND๋ก ๊ฒฐํฉ๋ฉ๋๋ค.
Floating Filter (ํค๋ ํํฐ ํ)
floatingFilter: true โ ํค๋ ๋ฐ๋ก ์๋์ ์ปฌ๋ผ๋ณ ์ธ๋ผ์ธ ํํฐ ์
๋ ฅ์ ํ์ํฉ๋๋ค.
text/number๋ ์
๋ ฅํ๋ ๋๋ก(250ms ๋๋ฐ์ด์ค) ํํฐ๋ง๋๊ณ , set์ ๋๋กญ๋ค์ด์ผ๋ก ๋จ์ผ ๊ฐ์ ๊ณ ๋ฆ
๋๋ค.
ํํฐ ๋ฉ๋ด์ ๊ฐ์ ํํฐ ๋ชจ๋ธ์ ๊ณต์ ํ๋ฏ๋ก Esc๋ก ์ง์ฐ๊ฑฐ๋ ๋ฉ๋ด์์ ๋ฐ๊พผ ๋ด์ฉ์ด ์๋ก ๋ฐ์๋ฉ๋๋ค.
Quick Filter
๋ชจ๋ ์ปฌ๋ผ์ ๋์์ผ๋ก ํ ์ ์ญ ๊ฒ์ โ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋ ๋ชจ๋ ๋จ์ด๊ฐ ์ผ์นํด์ผ ํฉ๋๋ค.
๊ณ ๊ธ ํํฐ (Advanced Filter)
advancedFilter: true โ AND/OR ๊ทธ๋ฃน์ 3๋จ๊น์ง ์ค์ฒฉํ ์กฐ๊ฑด ํธ๋ฆฌ๋ฅผ ๋ง๋ญ๋๋ค.
์ปฌ๋ผ ํํฐ์ ๋ฐฐํ๊ฐ ์๋๋ผ AND๋ก ํฉ์ฑ๋๋ฉฐ, ์ง๊ธ ๊ฑธ๋ฆฐ ์์ ํญ์ ๊ทธ๋ฆฌ๋ ์ ์์ฝ ๋ฐ์ ๋ณด์
๋๋ค.
๋ ์ง ๋น๊ต(before/after)์
๋น ๊ฐ(blank/notBlank)์ ๊ณ ๊ธ ํํฐ์๋ง ์์ต๋๋ค.
API๋ setAdvancedFilterModel() ยท
getAdvancedFilterModel() ยท
clearAdvancedFilter() ยท
openAdvancedFilterBuilder().
Row Selection
rowSelection: 'multiple' โ ์ฒดํฌ๋ฐ์ค, ํค๋ ์ ์ฒด ์ ํ(๋ถ๋ถ ์ ํ ์ indeterminate),
Ctrl/โ+ํด๋ฆญ ํ ๊ธ, Shift+ํด๋ฆญ ๋ฒ์ ์ ํ.
Pagination
ํ์ด์ง ํฌ๊ธฐ ์ ํ, ์ฒ์/์ด์ /๋ฒํธ/๋ค์/๋ง์ง๋ง ๋ฒํผ, "X to Y of Z" ์์ฝ. ํ์ด์ง๋ค์ด์ ์ ๋๋ฉด ์ ์ฒด ๊ฐ์ ์คํฌ๋กค๋ก ๋์ํฉ๋๋ค.
Basic Click & Pagination Events
cellClicked ยท rowClicked ยท
rowDoubleClicked ์ด๋ฒคํธ๋ ํด๋ฆญํ ์
/ํ์ payload๋ฅผ ์ ๋ฌํ๊ณ ,
paginationChanged๋ ํ์ด์ง ์ด๋ยทํ์ด์ง ํฌ๊ธฐ ๋ณ๊ฒฝ ๋
{ page, pageSize }๋ฅผ ์ ๋ฌํฉ๋๋ค (page๋ 0๋ถํฐ).
์ปฌ๋ผ Columns
์ปฌ๋ผ ์ ์ยทํ์ยทํค๋ ๊ตฌ์ฑ. ๊ฐ์ ์ด๋ป๊ฒ ๋ณด์ฌ์ค์ง์ ํค๋๋ฅผ ์ด๋ป๊ฒ ๋ฌถ์์ง.
Column Pinning ยท Resize ยท Reorder
pinned: 'left' | 'right' ๊ณ ์ ์ปฌ๋ผ(์คํฌ๋กค ์ ๊ทธ๋ฆผ์), ํค๋ ๊ฒฝ๊ณ ๋๋๊ทธ๋ก ํฌ๊ธฐ ์กฐ์ ,
๊ฒฝ๊ณ ๋๋ธํด๋ฆญ์ผ๋ก ์๋ ๋ง์ถค, ํค๋ ๋๋๊ทธ๋ก ์์ ๋ณ๊ฒฝ.
Column Visibility & Auto-size
column.hide๋ก ์ด๊ธฐ ์จ๊น์ ์ง์ ํ๊ณ , setColumnVisible(colId, visible)๋ก
๋ฐํ์์ ํ ๊ธํฉ๋๋ค. getColumns()๋ ์ ๊ทํ๋ ์ปฌ๋ผ ๋ชฉ๋ก์ ๋ฐํํ๊ณ
(์๋ ์ฒดํฌ๋ฐ์ค๊ฐ ์ด ๋ชฉ๋ก์ผ๋ก ๋ง๋ค์ด์ง๋๋ค), autoSizeColumn(colId)์
๋ด์ฉ ํญ์ ๋ง์ถฐ ์ปฌ๋ผ ํญ์ ์กฐ์ ํฉ๋๋ค (ํค๋ ๊ฒฝ๊ณ ๋๋ธํด๋ฆญ๊ณผ ๋์ผ).
Row Numbers ยท Max Width ยท Grid-level Editable
rowNumbers: true๋ ์ผ์ชฝ์ ๊ณ ์ ๋ ํ ๋ฒํธ ์ปฌ๋ผ์ ์ถ๊ฐํฉ๋๋ค(์ ๋ ฌยทํํฐยท๋ณต์ฌ ์ ์ธ).
column.maxWidth๋ ๋๋๊ทธ ๋ฆฌ์ฌ์ด์ฆยทflexยท์๋ ๋ง์ถค์ ์ํ์ด ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๋ ๋ ๋ฒจ editable: false / setEditable(bool)์
์ปฌ๋ผ ์ค์ ์ ๋ฌด์ํ๊ณ ํธ์ง ์ ์ฒด๋ฅผ ์ ๊ธ๋๋ค.
Column Data Type & Declarative Format
dataType: 'number' | 'date' | 'bool'์ ์ ๋ ฌ ๋น๊ตยท
filter: true์ ํํฐ ์ข
๋ฅยท๊ธฐ๋ณธ ์ ๋ ฌ ๋ฐฉํฅ(์ซ์๋ ์ค๋ฅธ์ชฝ)์ ์๋ ๊ฒฐ์ ํฉ๋๋ค.
format: '$#,##0.00' / 'yyyy-MM-dd' ์ ์ธ์ ํฌ๋งท์
valueFormatter๋ฅผ ๋์ ํ๋ฉฐ, ๊ฐ์ ํจํด์
DataGrid.format(value, pattern) ์ ํธ๋ก๋ ์ธ ์ ์์ต๋๋ค.
Column Group Headers
columnGroups: [{ headerName, children: ['field'...] }]๋
ํค๋ ์์ ๊ทธ๋ฃน ์คํฌ ํ์ ์ถ๊ฐํฉ๋๋ค. ๊ฐ์ ๊ทธ๋ฃน์ ์ฐ์๋ ์ปฌ๋ผ์ด ํ๋์ ์คํฌ์ผ๋ก ๋ฌถ์ด๊ณ ,
์ปฌ๋ผ์ ๋๋๊ทธํด ๊ทธ๋ฃน ๋ฐ์ผ๋ก ์ฎ๊ธฐ๋ฉด ์คํฌ์ด ์๋์ผ๋ก ๊ฐ๋ผ์ง๋๋ค.
๊ณ ์ (pinned) ์ปฌ๋ผ ๊ฒฝ๊ณ์์๋ ์คํฌ์ด ๋๊ฒจ ์คํฌ๋กค๊ณผ ์ด๊ธ๋์ง ์์ต๋๋ค.
Nested Column Group Headers (3๋จ ํค๋)
columnGroups์ children์ ์ปฌ๋ผ ์ด๋ฆ ๋์
๊ทธ๋ฃน ๊ฐ์ฒด๋ฅผ ๋ค์ ๋ฃ์ผ๋ฉด ๊ทธ๋ฃน ์ค์ด ํ ์ค ๋ ์๊ฒจ 3๋จ ํค๋๊ฐ ๋ฉ๋๋ค.
์์ ๊ทธ๋ฃน์ด ์๋ ๊ตฌ๊ฐ์ ์์ ๊ทธ๋ฃน์ด ๋ ์ค์ ์ฐจ์งํด ๋ผ๋ฒจ์ด ๊ฐ์ด๋ฐ์ ๋์
๋๋ค โ
๊ทธ๋์ ๊น์ด๊ฐ ์์ฌ ์์ด๋ ํ๊ฐ ๋ค์ญ๋ ์ญํด ๋ณด์ด์ง ์์ต๋๋ค.
์ค ์๋ ์ค์ ์ด ์๋๋ผ ์ง๊ธ ๋ณด์ด๋ ์ปฌ๋ผ์ ์ค์ ๋ก ๊ฑธ๋ฆฐ ๊น์ด๋ก ์ ํด์ง๋ฏ๋ก,
ํ์ ๊ทธ๋ฃน ์ปฌ๋ผ์ ์ ๋ถ ์จ๊ธฐ๋ฉด ๊ทธ ์ค์ด ์ ์ ๋ก ์ฌ๋ผ์ง๋๋ค.
Custom Header (headerRenderer / headerClass / headerTooltip)
column.headerRenderer(params)๋ ํค๋ ๋ผ๋ฒจ์ ์ปค์คํ
์ฝํ
์ธ (HTML ๋ฌธ์์ด ๋๋ Element)๋ก
๊ต์ฒดํฉ๋๋ค โ cellRenderer์ ํค๋ํ. ์ ๋ ฌยทํํฐ ๋ฉ๋ดยท๋ฆฌ์ฌ์ด์ฆยท๋ฆฌ์ค๋๋ ๊ทธ๋๋ก ๋์ํ๊ณ ,
์ปค์คํ
ํค๋ ์์ ๋ฒํผยท์
๋ ฅ ๋ฑ ์ธํฐ๋ํฐ๋ธ ์์ ํด๋ฆญ์ ์ ๋ ฌ์ ๋ฐ๋ํ์ง ์์ต๋๋ค.
headerClassยทheaderTooltip์ผ๋ก ํด๋์ค์ ํดํ๋ ์ง์ ํ ์ ์์ต๋๋ค.
Computed Columns & Row Styling
column.valueGetter(row)๋ ํ์ ๊ฐ์ ๊ณ์ฐํด ํ์ ๊ธฐ๋กํฉ๋๋ค โ
์ ๋ ฌยทํํฐยทCSV/JSON ๋ด๋ณด๋ด๊ธฐ ๋ชจ๋ ๊ฐ์ ๊ฐ์ ๋ด
๋๋ค.
getRowClass(row, index)๋ ํ๋ณ CSS ํด๋์ค๋ฅผ,
column.suppressMove๋ ํน์ ์ปฌ๋ผ์ ๋๋๊ทธ ์ด๋์ ๋ง์ต๋๋ค.
Merge Cells (์ฐ์ ๊ฐ ์ธ๋ก ๋ณํฉ)
mergeCells: ['field'...]๋ ํ์ ์์์ ์ฐ์๋ ๊ฐ์ ๊ฐ์ ์ธ๋ก๋ก ๋ณํฉํด
๋ณด์ฌ์ค๋๋ค โ ๋ณํฉ ๊ตฌ๊ฐ์ด ํ๋์ ์
์ด ๋์ด ๊ฐ์ด ์ธ๋ก ์ค์์ ํ์๋ฉ๋๋ค. ํด๋น ์ปฌ๋ผ์ผ๋ก ์ ๋ ฌํ๋ฉด
๋ณํฉ ํจ๊ณผ๊ฐ ์ปค์ง๊ณ , ๊ทธ๋ฃน ํค๋ยท๋ํ
์ผ ํ์์๋ ๋ณํฉ์ด ๋๊น๋๋ค. ๋ฐ์ดํฐ ์์ฒด๋ ๊ทธ๋๋ก๋ผ
CSV/ํด๋ฆฝ๋ณด๋์๋ ์ํฅ์ด ์์ต๋๋ค.
ํธ์ง Editing
์ธ๋ผ์ธ ์ ํธ์ง โ ์๋ํฐ ์ข ๋ฅ, ๊ฒ์ฆ, ํธ์ง ๊ฐ๋ฅ ๋ฒ์ ์ ์ด.
Cell Editing
editable: true ์
์ ๋๋ธํด๋ฆญ(๋๋ Enter)ํ๋ฉด ํธ์ง ์์ โ text / number / select
์๋ํฐ, Enter ์ปค๋ฐ, Esc ์ทจ์, cellValueChanged ์ด๋ฒคํธ ๋ฐํ.
Edit Validation & Programmatic Control
column.validator(value, row)๊ฐ true๊ฐ ์๋ ๊ฐ(์ค๋ฅ ๋ฉ์์ง ๋ฌธ์์ด)์
๋ฐํํ๋ฉด ์ปค๋ฐ์ด ๊ฑฐ๋ถ๋๊ณ ํธ์ง๊ธฐ๊ฐ ๋นจ๊ฐ ํ
๋๋ฆฌ๋ก ์ ์ง๋ฉ๋๋ค(Esc๋ก ์ทจ์).
beforeCellSave ์ด๋ฒคํธ์์ e.cancel = true๋ก ์ ์ฅ์ ๋ง์ ์ ์๊ณ ,
startEdit(row, field) / stopEdit(commit) /
isEditing()์ผ๋ก ํธ์ง์ ์ฝ๋๋ก ์ ์ดํฉ๋๋ค.
ํธ์ง ์๋ช
์ฃผ๊ธฐ๋ editingStarted / editingStopped๋ก ๊ด์ฐฐํฉ๋๋ค.
Continuous Editing & Custom Editor
editOnSingleClick(ํด๋ฆญ ํ ๋ฒ ํธ์ง) ยท
enterMovesDown(Enter๋ก ์๋ ์
์ฐ์ ํธ์ง) ยท
tabMovesRight(Tab/Shift+Tab์ผ๋ก ์ข์ฐ ์ด๋, ํ ๋์์ ์ค๋ฐ๊ฟ) ์ต์
๊ณผ,
editor: { init(cell, value, row, col), getValue(), destroy() }
์ปค์คํ
์๋ํฐ ๊ฐ์ฒด์
๋๋ค. Rating ์ปฌ๋ผ์ ์ฌ๋ผ์ด๋ ์๋ํฐ๋ฅผ ์๋๋ค.
Editable Column Indicator (editableIndicator)
editableIndicator: true๋ฅผ ์ฃผ๋ฉด ํธ์ง ๊ฐ๋ฅํ ์ปฌ๋ผ ํค๋์ ์ฐํ ์์ด์ฝ์ด ๋ถ์ต๋๋ค โ
์ด๋ค ์ปฌ๋ผ์ ๋๋ธํด๋ฆญํ ์ ์๋์ง ํ๋์ ๋ณด์
๋๋ค. ํ์ ๊ธฐ์ค์ ์ง๊ธ ์ค์ ๋ก ํธ์งํ ์ ์๋๊ฐ๋ผ์,
setEditable(false)๋ก ๊ทธ๋ฆฌ๋๋ฅผ ์ ๊ทธ๋ฉด ์์ด์ฝ๋ ํจ๊ป ์ฌ๋ผ์ง๋๋ค(๊ฑฐ์ง ํ์ ๋ฐฉ์ง).
์๋ ๋ฒํผ์ผ๋ก ํ์ธํด ๋ณด์ธ์.
Required Columns (column.required)
column.required: true๋ ํ์์ ๊ฒ์ฆ์ ํ ๋ฒ์ ์ผญ๋๋ค โ
๋น์ด ์๋ ์
์๋ง ์ค๋ฅธ์ชฝ ์ ๋ชจ์๋ฆฌ ๋ง์ปค๊ฐ ๋ํ๋๋ฉฐ,
๋น ๊ฐ ์ปค๋ฐ์ ์ธ๋ผ์ธ ํธ์ง ยท ํ์
ํผ ยท ๋ถ์ฌ๋ฃ๊ธฐ ยท updateRows
์ด๋ ๊ฒฝ๋ก๋ก๋ ๊ฑฐ๋ถ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๋ ํ์๋ ์
๋ง์ปค ํ๋์ด๊ณ ํค๋์๋ ํ์์ ๋์ง ์์ต๋๋ค โ
ํ์ ์ปฌ๋ผ์ ๋ชจ๋ ์
์ ๊ทธ๋ฆฌ๋ฉด ๋ค ๊ฐ์ ํ์๋ผ ์ ๋ณด๋์ด 0์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
(* ํ์์ ํ์
ํผ ๋ผ๋ฒจ์๋ง ๋ถ์ต๋๋ค โ ์๋ "์ฒซ ํ ํผ ํธ์ง"์ผ๋ก ํ์ธํ์ธ์.)
trackChanges์ ์์ ๋จ ๋ง์ปค(์ผ์ชฝ ์ ์ฃผํฉ)์
์๋ฆฌยท์์ด ๊ฒน์น์ง ์๊ฒ ์ค๋ฅธ์ชฝ ์ ๋นจ๊ฐ์ ์๋๋ค โ ํ ์
์ ๋์ด ๋์์ ๋ฐ ์ ์์ต๋๋ค.
0๊ณผ false๋ ์ ํจํ ๊ฐ์ผ๋ก ์ทจ๊ธํฉ๋๋ค.
๋จ numberยทdate ์๋ํฐ๋
๋น ์
๋ ฅ์ด ๊ธฐ์กด ์ ๊ทํ ๊ท์น์ ๋ฐ๋ผ ์ด์ ๊ฐ์ผ๋ก ๋๋์๊ฐ๋ฏ๋ก ์ ์ด์ ๋น ๊ฐ์ด
์ปค๋ฐ๋์ง ์์ต๋๋ค โ ์ธ๋ผ์ธ์์ required ์ค๋ฅ๋ฅผ ๋ณด๋ ค๋ฉด ํ
์คํธ ๊ณ์ด ์ปฌ๋ผ(์๋ Department)์ ์ฐ์ธ์.
Row / Cell Locking (setRowEnabled ยท setCellEnabled)
setRowEnabled(row, false)๋ ํ์,
setCellEnabled(row, field, false)๋ ์
์ ์ ๊ธ๋๋ค.
ํ ์ ๊ธ์ ํธ์ง(์ธ๋ผ์ธยท๋ถ์ฌ๋ฃ๊ธฐยท์ฑ์ฐ๊ธฐยทํ์
ํผ)๊ณผ ์ ํ๊น์ง ๋ง๊ณ ํ๋ฆฌ๊ฒ ํ์ํ๋ฉฐ,
์
์ ๊ธ์ ํธ์ง ๊ณ์ด๋ง ๋ง์ต๋๋ค. ์ ๊ธ ์ํ๋ ๊ทธ๋ฆฌ๋๊ฐ ๋ค๊ณ ์์ผ๋ฏ๋ก ํธ์ถ ํ ๋ฒ์ด๋ฉด
๋ค์ ๊ทธ๋ฆฌ๊ธฐ๊น์ง ๋๋๊ณ , setRowData()๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์๋ผ์ฐ๋ฉด ํจ๊ป ์ด๊ธฐํ๋ฉ๋๋ค.
์กฐํ๋ isRowEnabled(row) / isCellEnabled(row, field),
์ผ๊ด ํด์ ๋ resetEnabled()์
๋๋ค.
Date / DateTime Editor (editor: 'date' | 'datetime')
editor: 'date' / editor: 'datetime'์ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ณธ ๋ ์ง ํผ์ปค
(<input type="date"> / datetime-local)๋ก ํธ์งํฉ๋๋ค.
dataType: 'date'๋ง ์ค๋ date ์๋ํฐ๊ฐ ์๋ ์ ํ๋ฉ๋๋ค.
์ปค๋ฐ ๊ฐ์ ์๋ณธ ํ์
์ ๋ณด์กดํฉ๋๋ค โ ๋ฌธ์์ด์ด์์ผ๋ฉด ๋ฌธ์์ด(์ปฌ๋ผ format ํ๊ธฐ),
Date์์ผ๋ฉด Date, ํ์์คํฌํ ์ซ์์์ผ๋ฉด ์ซ์.
editorOptions: { min, max }๋ก ์ ํ ๋ฒ์๋ฅผ ์ ํํ๊ณ , ์
๋ ฅ์ ๋น์ฐ๋ฉด null๋ก ์ง์์ง๋๋ค.
์๋ ์ํ ์ค์์ ์ปค๋ฐ๋ ๊ฐ์ ํ์
์ ํ์ธํด ๋ณด์ธ์.
Select Editor โ label/value Options
editorOptions๋ ๋ฌธ์์ด ๋ฐฐ์ด ์ธ์
{ label: 'ํ๊ตญ', value: 'kr' } ๊ฐ์ฒด ๋ฐฐ์ด๋ ๋ฐ์ต๋๋ค โ
๋๋กญ๋ค์ด์๋ label์ด ํ์๋๊ณ , ์ ํํ๋ฉด value๊ฐ
๋ฐ์ดํฐ์ ์ ์ฅ๋์ด ์
์ ํ์๋ฉ๋๋ค (์ซ์ value๋ ํ์
์ด ๋ณด์กด๋ฉ๋๋ค).
editor๋ฅผ ์ ์ธํ ์ปฌ๋ผ์ editable: true๋ฅผ
์๋ตํด๋ ํธ์ง์ด ์ผ์ง๋๋ค (๋ช
์์ editable: false๊ฐ ์ฐ์ ).
Searchable Select Editor (editorSearch)
editor: 'select'์ editorSearch๋ฅผ ์ฃผ๋ฉด ๋ค์ดํฐ๋ธ ์
๋ ํธ ๋์
๊ฒ์ ์
๋ ฅ์ด ์๋ ์ต์
ํจ๋๋ก ๋ฐ๋๋๋ค. editorSearch: true๋ ์ ์
editorOptions๋ฅผ ๋ก์ปฌ์์ ํํฐํ๊ณ , editorSearch: { fetch(query) }๋
์ง์๋ง๋ค ๋น๋๊ธฐ๋ก ๋ชฉ๋ก์ ๋ถ๋ฌ์ต๋๋ค (lazy ๊ฒ์ โ debounceยทminLengthยท
placeholder ์ต์
). ์ง๊ฟ ๋ ๋๋ฌ DataGrid.renderers.searchselect()๋
lazy ๊ฒ์์ผ๋ก ๊ณ ๋ฅธ(์ ์ ๋ชฉ๋ก์ ์๋) ๊ฐ๋ ์ ํ ๋น์์ label๋ก ํ์ํฉ๋๋ค.
ํด๋ฐ ์ฒดํฌ๋ฐ์ค๋ก editOnSingleClick์ ์ผ์ ํด๋ฆญ ํ ๋ฒ ํธ์ง๊ณผ ํจ๊ป ํ
์คํธํด ๋ณด์ธ์.
Multiselect ยท Radio ยท Checkbox Editors & Renderers
editor์ 'multiselect'(์ฒดํฌ๋ฆฌ์คํธ ํจ๋, ๊ฐ์ ๋ฐฐ์ด)ยท
'radio'(๋จ์ผ ์ ํ ๋ผ๋์ค ํจ๋)ยท'checkbox'(์ฒดํฌ๋ฐ์ค)๋ฅผ
์ง์ ํ ์ ์๊ณ , ๊ฐ๊ฐ ์ง๊ฟ ๋ ๋๋ฌ DataGrid.renderers.multiselect()(label ์นฉ ๋ชฉ๋ก)ยท
renderers.radio()(value โ label)ยทrenderers.checkbox()(ํ์ ์ ์ฉ ์ฒดํฌ๋ฐ์ค)๊ฐ
์์ต๋๋ค. multiselect๋ editorOptions ์์๋๋ก ๋ฐฐ์ด์ ์ปค๋ฐํ๋ฉฐ ๋ด์ฉ์ด ๊ฐ์ผ๋ฉด ์ปค๋ฐํ์ง ์์ต๋๋ค.
checkbox๋ ๋ถ๋ฆฌ์ธ ์ธ์ editorOptions: { checked: 'Y', unchecked: 'N' } ๋งคํ์ผ๋ก
Y/Nยท0/1 ๊ฐ์ ํ๊ธฐ๋ ๊ทธ๋๋ก ์ ์ฅยทํ์ํฉ๋๋ค.
Searchable Multiselect Editor (multiselect + editorSearch)
editor: 'multiselect'์๋ editorSearch๋ฅผ ์ค ์ ์์ต๋๋ค (v2.25).
์คํค๋ง๋ ๊ฒ์ํ select์ ๋์ผํฉ๋๋ค โ true๋ฉด ์ ์
editorOptions๋ฅผ ๋ก์ปฌ ํํฐํ๊ณ , { fetch(query) }๋ฉด
์ง์๋ง๋ค ๋น๋๊ธฐ๋ก ๋ชฉ๋ก์ ๋ถ๋ฌ์ต๋๋ค. ๊ณ ๋ฅธ ๊ฐ์ ์นฉ์ผ๋ก ๊ฒ์์ฐฝ ์์ ์์ ํ์๋๋ฏ๋ก,
ํํฐ๋ก ๋ชฉ๋ก์์ ๊ฐ๋ ค์ง๊ฑฐ๋ lazy ์ง์๋ก ๋ชฉ๋ก์ด ํต์งธ๋ก ๊ฐ๋ ค๋ ์ง๊ธ ๋ฌด์์ด ๊ณจ๋ผ์ ธ ์๋์ง ์ฌ๋ผ์ง์ง ์์ต๋๋ค.
์นฉ์ ร ๋๋ ํญ๋ชฉ ์ฌํด๋ฆญ์ผ๋ก ํด์ ํฉ๋๋ค.
Enter๋ ๋ชฉ๋ก์ด ๋ณด์ผ ๋๋ง ํ์ฑ ํญ๋ชฉ(โ/โ๋ก ๊ณ ๋ฅธ ๊ฒ)์ ํ ๊ธํ๊ณ , ๋ชฉ๋ก์ด ์ ํ ์์ผ๋ฉด
์
์์๋ ์ปค๋ฐ ยท ํผ์์๋ ์ ์ฅ์ผ๋ก ๋์ด๊ฐ๋๋ค โ ๋ง์ฐ์ค๋ก ๊ณ ๋ฅธ ์งํ์ Enter๊ฐ ๋ฐฉ๊ธ ๊ณ ๋ฅธ ํญ๋ชฉ์
๋๋๋ฆฌ์ง ์์ต๋๋ค (BUG-014).
์ ์ฅ ์์๋ ๊ณ ๋ฅธ ์์์ด๋ฉฐ,
์๋ณธ์ด ๋ฐฐ์ด์ด๋ฉด ๋ฐฐ์ด๋ก ยท ์ฝค๋ง ๋ฌธ์์ด์ด๋ฉด ์ฝค๋ง ๋ฌธ์์ด๋ก ๋๋๋ ค ์ปค๋ฐํฉ๋๋ค.
ํ์
ํผ(popupEditor)์์๋ ์ ํ๋ ์ฝค๋ณด๋ฐ์ค๊ฐ ๋ฉ๋๋ค โ
ํ์์ ์นฉ ์ค๊ณผ ๊ฒ์์ฐฝ๋ง ๋ณด์ด๊ณ ํด๋ฆญยทํ์ดํํ ๋๋ง ๋ชฉ๋ก์ด ๋ ์ ๋ค๋ฅธ ํ๋๋ฅผ ๋ฎ์ต๋๋ค.
๊ฒ์์ด ์๋ ์ผ๋ฐ multiselect๊ฐ ํผ์์ ํญ์ ํผ์ณ์ง๋ ์ด์ ๋ "๊ณ ๋ฅธ ๊ฐ์ ๋ณด์ฌ์ค ์๋ฆฌ๊ฐ
์์ด์"์ธ๋ฐ, ์นฉ ์ค์ด ๊ทธ ์๋ฆฌ๋ฅผ ๋์ ํ๋ฏ๋ก ์ ์ด๋ ์ ๋ณด๊ฐ ์ฌ๋ผ์ง์ง ์์ต๋๋ค.
Fill Handle (์์ ์ ์ฑ์ฐ๊ธฐ)
fillHandle: true(cellSelection ํ์)๋
์ ํ ๋ฒ์ ์ฐํ๋จ์ ์ฑ์ฐ๊ธฐ ํธ๋ค์ ํ์ํฉ๋๋ค. ํธ๋ค์ ์ธ๋ก๋ก ๋๋๊ทธํ๋ฉด
์ซ์ 2๊ฐ ์ด์์ ๋ฑ์ฐจ ์์ด๋ก ์ธ์ฝํ๊ณ (1, 3 โ 5, 7, 9โฆ), ๊ทธ ์ธ์๋ ํจํด์ ๋ฐ๋ณตํฉ๋๋ค.
ํธ์ง ๊ฐ๋ฅํ ์
์๋ง ์ฐ์ด๊ณ validatorยท
beforeCellSave๋ฅผ ํต๊ณผํ ๊ฐ๋ง ๋ฐ์๋ฉ๋๋ค.
ํผ ํธ์ง Popup Editor
ํ ๋จ์ ํผ ํธ์ง. ์ธ๋ผ์ธ ์๋ํฐ์ ์ปฌ๋ผ ์ ์๋ฅผ ๊ทธ๋๋ก ์ฌ์ฌ์ฉํฉ๋๋ค.
Popup Editor (popupEditor)
popupEditor๋ ์ธ๋ผ์ธ ์
ํธ์ง ๋์ ํ ์ ์ฒด๋ฅผ ํผ์์ ํธ์งํฉ๋๋ค.
ํผ์ ๊ฐ ํ๋๋ ์ปฌ๋ผ ์ ์๋ฅผ ๊ทธ๋๋ก ์ฌ์ฌ์ฉํ๋ฏ๋ก
editor ยท editorOptions ยท
validator๊ฐ ์ธ๋ผ์ธ๊ณผ ๋๊ฐ์ด ๋์ํฉ๋๋ค โ
์๋ ์์ ๋ ์ง์ํ๋ ์๋ํฐ ํ์์ ์ ๋ถ ํ ํผ์ ๋ด์์ต๋๋ค:
text ยท text+validator ยท number ยท date ยท datetime ยท select(๋ฌธ์์ด) ยท
select({ label, value }) ยท ๊ฒ์ํ select(์ ์ ) ยท
๊ฒ์ํ select(lazy fetch) ยท multiselect ยท radio ยท
checkbox(๋ถ๋ฆฌ์ธ) ยท checkbox(Y/N ๊ฐ ๋งคํ) ยท ์ปค์คํ
๊ฐ์ฒด ยท ์ฝ๊ธฐ ์ ์ฉ.
๊ฒ์ฆ์ ์คํจํ๋ฉด ๋ผ๋ฒจ์ด ๋นจ๊ฐ๊ฒ ๋ฐ๋๋ฉฐ ์ ์ฅ์ด ๋งํ๋๋ค.
์์น๋ 'center'(๊ธฐ๋ณธ) ยท 'left' ยท
'right'(์ฌ๋ผ์ด๋ ํจ๋), ๋ฐฐ์น๋ columns: 1 | 2
(ํญ์ด ๋ชจ์๋ผ๋ฉด ์๋์ผ๋ก 1์ด์ด ๋๊ณ , ๋ ์ข์์ง๋ฉด ๋ผ๋ฒจ์ด ์
๋ ฅ ์๋ก ์ฌ๋ผ๊ฐ๋๋ค).
ํ์ ๋๋ธํด๋ฆญํ๊ฑฐ๋ ์๋ ๋ฒํผ์ ๋๋ฌ ๋ณด์ธ์.
Popup Editor โ ๋ฒํผ ยท ์ปฌ๋ผ ๋จ์ ์ปค์คํฐ๋ง์ด์ฆ
ํผ ํ๋จ ๋ฒํผ์ buttons ๋ฐฐ์ด๋ก ๊ตฌ์ฑํฉ๋๋ค โ
๋ฌธ์์ด 'save'/'cancel'์ ๋ด์ฅ ๋ฒํผ์ด๊ณ ,
๊ฐ์ฒด๋ฅผ ์์ด ๋ฐฐ์ด ์์๋๋ก ๋ฐฐ์นํฉ๋๋ค.
์ปฌ๋ผ๋ง๋ค column.popupEditor๋ก ํ์
์์์๋ง
๋ผ๋ฒจ ยท ๋์๋ง ยท ์์ ยท ์ฝ๊ธฐ ์ ์ฉ ยท span์ ๋ฐ๊พธ๊ฑฐ๋,
์๋ํฐ๋ฅผ ํต์งธ๋ก ๊ต์ฒดํ๊ณ (์
์ ์ข์ผ๋ select, ํผ์ ๋์ผ๋ ๊ฒ์ํ),
ํผ์์๋ง ๋ค๋ฅธ validator๋ฅผ ๊ฑธ๊ณ ,
ํ๋ ์ ๋ฒํผ๊ณผ ์์ HTML(before/after)์ ๋ฃ์ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๋ ์
์ ํ์ยท๋์์ ์ ํ ๋ฐ๋์ง ์์ต๋๋ค โ ์๋ ๊ทธ๋ฆฌ๋์์ ์
์ ์ง์ ๋ณด์ธ์.
Popup Button onLoad (๋ฒํผ ์ด๊ธฐํ ํ )
ํ์
๋ฒํผ์ onLoad๋ ํผ์ด ์์ ํ ๋ง๋ค์ด์ง ์งํ ํ ๋ฒ ํธ์ถ๋ฉ๋๋ค โ
onClick๊ณผ ๊ฐ์ ์ปจํ
์คํธ์ ๋ฒํผ DOM(ctx.buttonEl)์ด
๋ํด์ ธ, ํ ๊ฐ์ ๋ณด๊ณ ๋ฒํผ ๋ฌธ๊ตฌยท์ ๊ธ์ ์ ํ๊ฑฐ๋ ํด๋น ํ๋(ctx.fieldEl)์
๊ฐ(ctx.setValue)์ ์ด๊ธฐํํ ์ ์์ต๋๋ค.
ํธ์ถ ์์๋ DOM ์์(ํ๋ ๋ฒํผ โ ํธํฐ ๋ฒํผ)์ด๊ณ , ๋ชจ๋ ํ๋๊ฐ ์ด๋ฏธ ์กด์ฌํ๋ฏ๋ก
๋ค๋ฅธ ํ๋๋ ์์ ํ๊ฒ ๋ง์ง ์ ์์ต๋๋ค.
๋ฐ์ดํฐ ยท CRUD Data & CRUD
ํ ์ถ๊ฐยท์์ ยท์ญ์ ์ ๋ณ๊ฒฝ ์ถ์ . ์ ์ฅ ์ ์คํ ์ด์ง ์ํ๋ฅผ ๋ค๋ฃน๋๋ค.
Row Data API (CRUD)
setRowData ยท addRow ยท
updateRow(row, changes) ยท removeRows๋ก ํ์
ํ๋ก๊ทธ๋๋งคํฑํ๊ฒ ๊ด๋ฆฌํฉ๋๋ค. getRowId ์ต์
์ ํ ์๋ณ ๊ธฐ์ค์ ์ง์ ํ๊ณ ,
getRowData()๋ ์ ์ฒด ๋ฐ์ดํฐ, getDisplayedRows()/
getDisplayedRowCount()๋ ํํฐยท์ ๋ ฌ์ด ์ ์ฉ๋ ํ์ ๋ทฐ ๊ธฐ์ค์
๋๋ค.
Insert Position (addRow / addRows index)
addRow(row, index) / addRows(rows, index)์
๋ ๋ฒ์งธ ์ธ์๋ก ์ฝ์
์์น๋ฅผ ์ง์ ํฉ๋๋ค โ 0์ด๋ฉด ๋งจ ์, ์๋ตํ๋ฉด ๊ธฐ์กด์ฒ๋ผ ๋งจ ๋ค.
๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด ํด๋จํ๋ฉ๋๋ค. index๋ ์๋ณธ ๋ฐฐ์ด ๊ธฐ์ค์ด๋ผ ์ ๋ ฌ์ด ์ผ์ ธ ์์ผ๋ฉด ํ์ ์์๋ ์ ๋ ฌ์ด ๊ฒฐ์ ํฉ๋๋ค.
rowNumbers๋ก ์ฝ์
์์น๋ฅผ ํ์ธํด ๋ณด์ธ์.
Change Tracking & Undo / Redo
trackChanges: true๋ ๋ง์ง๋ง ๊ธฐ์ค์ ์ดํ์ ๋ณ๊ฒฝ์ ์ถ์ ํฉ๋๋ค โ
์์ ์
์ ๋ชจ์๋ฆฌ ๋ง์ปค(dirty), ์ถ๊ฐ ํ์ ๋ฐฐ๊ฒฝ์ผ๋ก ํ์๋๊ณ
getChanges() / commitChanges() /
rollbackChanges()๋ก ์ ์ดํฉ๋๋ค.
undoRedo: true๋ Ctrl+Z / Ctrl+Y์
undo() / redo()๋ฅผ ํ์ฑํํฉ๋๋ค.
Built-in CRUD Staging (statusColumn / softDelete)
์ ์นด๋์ ์คํ
์ด์ง ํจํด์ ์ต์
๋ ๊ฐ๋ก ์ฒ๋ฆฌํฉ๋๋ค โ ์ํ ๊ด๋ฆฌ ์ฝ๋๊ฐ ์ ํ ์์ต๋๋ค.
statusColumn์ ๋ณ๊ฒฝ ์ถ์ ์ํ(added/updated/deleted)๋ฅผ ํ๊ทธ ์ปฌ๋ผ์ผ๋ก ํ์ํ๊ณ ,
softDelete: true๋ ์ญ์ ๋ฅผ ์คํ
์ด์ง์ผ๋ก ๋ฐ๊ฟ๋๋ค:
์๋ฒ ํ์ ์ญ์ ํ์(์ทจ์์ , ํธ์ง ์ฐจ๋จ, restoreRows()๋ก ๋ณต์),
์ ๊ท ํ์ ๋ก์ฐ ์์ฒด ์ ๊ฑฐ. ์
์ ๋๋ธํด๋ฆญํด ํธ์งํ๋ฉด ์๋์ผ๋ก ‘์์ ’์ด ๋๊ณ ,
commitChanges()(์ ์ฅ ์ฑ๊ณต ํ โ ์ญ์ ํ์ ํ ๋ฌผ๋ฆฌ ์ ๊ฑฐ) /
rollbackChanges()(์ ๋ถ ๋๋๋ฆฌ๊ธฐ)๋ก ๋ง๋ฌด๋ฆฌํฉ๋๋ค.
๊ทธ๋ฃนํ ยท ํธ๋ฆฌ Grouping & Tree
ํ์ ๊ณ์ธต์ผ๋ก ๋ฌถ๋ ์ธ ๊ฐ์ง ๋ฐฉ์ โ ๊ทธ๋ฃนํ, ํธ๋ฆฌ, ๋ง์คํฐ-๋ํ ์ผ.
Row Grouping & Aggregation
groupBy: ['department']๋ก ํ์ ๊ทธ๋ฃนํํ๊ณ , ๊ทธ๋ฃน ํค๋ ํ์ ํด๋ฆญ(๋๋ Enter)ํด ์ ๊ณ ํผ์นฉ๋๋ค.
aggFunc: 'sum' | 'avg' | 'min' | 'max' | 'count'๋ฅผ ์ปฌ๋ผ์ ์ง์ ํ๋ฉด
๊ทธ๋ฃน ํค๋์ grandTotal ์์ฝ ํ์ ์ง๊ณ๊ฐ์ด ํ์๋ฉ๋๋ค.
๋ค๋จ๊ณ ๊ทธ๋ฃนํ(['department', 'city'])๋ ์ง์ํฉ๋๋ค.
Custom aggFunc (์ง๊ณ ํจ์ ์ง์ ์์ฑ)
aggFunc์ ๋ฌธ์์ด ๋์ (values, ctx) => any ํจ์๋ฅผ ์ค ์ ์์ต๋๋ค.
values๋ ๊ทธ ์ปฌ๋ผ์ ์๋ณธ ๊ฐ ๋ฐฐ์ด,
ctx๋ { rows, field, colDef, parent }์ด๊ณ
parent๋ ํธ๋ฆฌ ์์ฝ์์๋ง ๋ถ๋ชจ ํ์
๋๋ค(๊ทธ๋ฃนยท์ ์ฒดํฉ๊ณ์์๋ null).
์ง๊ณ๋ ํํฐ ์ ์ฉ ํ์ ํ์ผ๋ก ๋งค๋ฒ ๋ค์ ๊ณ์ฐ๋๋ฏ๋ก,
์๋ Name ์ปฌ๋ผ์ (์์ ์)๋ ํํฐ๋ฅผ ์๋์ผ๋ก ๋ฐ๋ผ๊ฐ๋๋ค.
์ปค์คํ
ํจ์์ ๊ฒฐ๊ณผ์๋ valueFormatter๊ฐ ์ ์ฉ๋์ง ์์ต๋๋ค โ ํจ์๊ฐ ์ด๋ฏธ ์ถ๋ ฅ์ ์ ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
Tree Grid (treeData)
treeData๋ ๊ณ์ธต ๋ฐ์ดํฐ๋ฅผ ํธ๋ฆฌ๋ก ํ์ํฉ๋๋ค โ nested(children ๋ฐฐ์ด)์
flat(parentId) ํ์์ ๋ชจ๋ ์ง์ํ๊ณ , ์ ๋ ฌ์ ํ์ ๋ผ๋ฆฌ, ํํฐ๋ ๋งค์น๋ ๋
ธ๋์ ์กฐ์์ ์ ์งํ ์ฑ ๋์ํฉ๋๋ค.
expandAllNodes()/collapseAllNodes()/toggleNode()๋ก ํ๋ก๊ทธ๋จ ์ ์ด,
beforeNodeToggle(์ทจ์ ๊ฐ๋ฅ)/nodeExpanded/nodeCollapsed ์ด๋ฒคํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
Tree Checkbox โ cascade (checkboxSelection)
ํธ๋ฆฌ ๋ชจ๋์์๋ ๊ธฐ์กด checkboxSelection ์ปฌ๋ผ์ด 3์ํ ์บ์ค์ผ์ด๋ ์ฒดํฌ๋ฐ์ค๊ฐ ๋ฉ๋๋ค โ
๋ถ๋ชจ๋ฅผ ์ฒดํฌํ๋ฉด ์์ ์ ์ฒด๊ฐ ํ ์ ํ๋๊ณ , ์์ ์ผ๋ถ๋ง ์ ํ๋๋ฉด ๋ถ๋ชจ๊ฐ
indeterminate๋ก ํ์๋ฉ๋๋ค (treeData.cascade: false๋ก ๋ ์ ์์).
๋ณ๋ API ์์ด ์ ํ API๋ฅผ ๊ทธ๋๋ก ์๋๋ค: getSelectedRows()ยท
selectAll()/deselectAll()ยทselectionChanged/beforeSelectionChange.
headerCheckboxSelection์ ํค๋ ์ฒดํฌ๋ฐ์ค๋ ํธ๋ฆฌ ๊ท์น์ ๋ฐ๋ฆ
๋๋ค โ
์ ์ฒด ์ฒดํฌ/ํด์ ์ treeData.checkboxDisabled(row) ํ์ ๊ฑด๋๋ฆฌ์ง ์๊ณ ,
ํ์ ์ํ(์ ์ฒด/์ผ๋ถ)๋ ์ฒดํฌ ๊ฐ๋ฅํ ํ๋ง ๊ธฐ์ค์ผ๋ก ๊ณ์ฐํฉ๋๋ค.
์ด ์นด๋๋ flat(parentId) ํ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Tree Summary (treeData.summary)
treeData.summary: true๋ column.aggFunc๊ฐ ์ง์ ๋ ์ปฌ๋ผ์์
๋ถ๋ชจ ๋
ธ๋ ํ์ ์์ ๋ฆฌํ๋ค์ ์ง๊ณ๊ฐ์ ํ์ํฉ๋๋ค (ํ์ ์ ์ฉ โ ๋ฐ์ดํฐ๋ ๊ทธ๋๋ก).
ํํฐ๋ฅผ ๊ฑธ๋ฉด ๋จ์ ๋ฆฌํ ๊ธฐ์ค์ผ๋ก ์ง๊ณ๊ฐ ๋ค์ ๊ณ์ฐ๋ฉ๋๋ค.
Tree Lazy Loading (treeData.fetchChildren)
treeData.fetchChildren(row)๋ ๋
ธ๋๋ฅผ ์ฒ์ ํผ์น ๋ ์์์ ๋น๋๊ธฐ๋ก ๋ก๋ํฉ๋๋ค
(Promise ๋ฐํ, ๋ก๋ฉ ์ค ํ ๊ธ์ด ์คํผ๋๋ก ํ์ ). hasChildren(row)๊ฐ ๋ก๋ ์ ํ ๊ธ ํ์ ์ฌ๋ถ๋ฅผ
๊ฒฐ์ ํ๊ณ , ๋น ๋ฐฐ์ด์ด ์ค๋ฉด ๋ฆฌํ๋ก ํ์ ๋ฉ๋๋ค. ์คํจ ์ dataLoadError๊ฐ ๋ฐ์ํ๊ณ
์ ํ ์ํ๋ก ๋จ์ ์ฌ์๋ํ ์ ์์ต๋๋ค.
Master-Detail Rows
rowDetail: { renderer(row), height }๋ ํ ์๋์ ์ปค์คํ
๋ํ
์ผ ํจ๋์ ํผ์นฉ๋๋ค.
์ฒซ ์ปฌ๋ผ์ ์
ฐ๋ธ๋ก (์๋ ์ถ๊ฐ)์ด๋ expandRow(row) /
collapseRow(row) / toggleRowDetail(row)๋ก ์ ์ดํ๊ณ
rowExpanded / rowCollapsed ์ด๋ฒคํธ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ํ
์ผ ๋์ด๋ ๊ฐ์ ์คํฌ๋กค ๋ ์ด์์์ ์ ํํ ๋ฐ์๋ฉ๋๋ค.
(renderer ๋ฐํ HTML์ ์ด์ค์ผ์ดํ๋์ง ์์ผ๋ฏ๋ก ์ ๋ขฐํ ์ ์๋ ๋งํฌ์
๋ง ์ฌ์ฉํ์ธ์.)
์๊ฒฉ ๋ฐ์ดํฐ Remote Data
์๋ฒ์์ ์กฐํํ๋ ๊ทธ๋ฆฌ๋ โ ์๋ฒ ์ ๋ ฌยทํํฐยทํ์ด์ง๊ณผ ๋ฌดํ ์คํฌ๋กค.
Remote Data Source (Server-side Sort / Filter / Paging)
dataSource: { url, method, params, parse }๋ fetch๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
sortMode / filterMode /
pageMode: 'server'์ธ ์ถ์ ํด๋ผ์ด์ธํธ ์ฒ๋ฆฌ๋ฅผ ๊ฑด๋๋ฐ๊ณ ํ์ฌ ์ํ๋ฅผ
์์ฒญ ํ๋ผ๋ฏธํฐ(pageยทpageSizeยทsortยทfilterยทquickFilter)๋ก ๋ณด๋
๋๋ค.
reloadData()๋ก ๋ค์ ๋ถ๋ฌ์ต๋๋ค. ์ด ๋ฐ๋ชจ๋ ๋ฐ๋ชจ ์๋ฒ์
/api/employees(500ํ)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Remote Data Source โ ์๋ฒ ์คํ ๋ง์ถค (request / parse / headers)
์๋ฒ์ ํ๋ผ๋ฏธํฐยท์๋ต ์คํ์ด ๊ทธ๋ฆฌ๋ ๊ธฐ๋ณธ๊ฐ๊ณผ ๋ค๋ฅผ ๋:
dataSource.request(state)๋ก ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ ์๋ฒ ์คํ(์:
offset/limit/orderBy)์ผ๋ก ๋ฐ๊พธ๊ณ , parse(json)์ผ๋ก
envelope ์๋ต์ { rows, total }๋ก ๋ณํํ๋ฉฐ,
headers๋ก ์ธ์ฆ ํ ํฐ์ ๋ณด๋
๋๋ค. ์กฐํ ์กฐ๊ฑด์ params
ํจ์ + reloadData()๋ก, ์๋ฒ ๊ต์ฒด๋ setDataSource()๋ก.
์ด ๋ฐ๋ชจ๋ ๋ฐ๋ชจ ์๋ฒ์ /api/employees-v2(๋ค๋ฅธ ์คํ์ ์๋ฒ ํ๋ด)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Nested Request Params (์ค์ฒฉ ํ๋ผ๋ฏธํฐ ์ง๋ ฌํ)
dataSource.request๊ฐ ์ค์ฒฉ ๊ฐ์ฒดยท๋ฐฐ์ด์ ๋ฐํํด๋ ์ฟผ๋ฆฌ์คํธ๋ง์ผ๋ก ์ฌ๋ฐ๋ฅด๊ฒ ํผ์ณ์ง๋๋ค.
์ฟผ๋ฆฌ์คํธ๋ง์ ์ค์ฒฉ ํ๊ธฐ๋ ํ์ค์ด ์์ด ์๋ฒ๋ง๋ค ๊ด๋ก๊ฐ ๋ค๋ฅด๋ฏ๋ก
dataSource.paramsFormat์ผ๋ก ๋ง์ถฅ๋๋ค โ
'dot'(๊ธฐ๋ณธ, SpringยทASP.NET)์ page.selectPage=1,
'bracket'(qsยทPHPยทRails)์ page[selectPage]=1.
๋ฐฐ์ด ์ธ๋ฑ์ค๋ ๋ ํ๊ธฐ ๋ชจ๋ ๋๊ดํธ์
๋๋ค(sorts[0].field โ Spring์ List ๋ฐ์ธ๋ฉ ๊ท์ฝ).
๋ ๋ค ์๋๋ฉด paramsSerializer๋ก ์ง๋ ฌํ๋ฅผ ํต์งธ๋ก ๋์ฒดํ์ธ์.
์๋ ์
๋ ํธ๋ก ๋ฐ๊ฟ ๋ณด๋ฉด status line์ ๋ฐ๋ชจ ์๋ฒ๊ฐ ์ค์ ๋ก ๋ณต์ํ ๊ตฌ์กฐ๊ฐ ํ์๋ฉ๋๋ค
(์ด ์นด๋๋ ๋ฐ๋ชจ ์๋ฒ๊ฐ ์์ด์ผ ๋์ํฉ๋๋ค โ ๋ก์ปฌ์์๋
node demo/server.js 8087).
Deferred First Load (dataSource.autoLoad)
dataSource.autoLoad: false๋ฉด ๊ทธ๋ฆฌ๋๊ฐ ์ค์ค๋ก ์ฒซ ์กฐํ๋ฅผ ํ์ง ์์ต๋๋ค
(๊ธฐ๋ณธ๊ฐ true). ๊ฒ์ ์กฐ๊ฑด์ ๋ฐ์ ๋ค์ ์กฐํํ๋ ํ๋ฉด, ๋น์ผ ์ฟผ๋ฆฌ,
ํญ์ด ์ด๋ฆด ๋๊น์ง ๋ฏธ๋ฃจ๋ ๊ฒฝ์ฐ์ ์๋๋ค.
๋ฐ์ดํฐ ์์ค๋ฅผ ๋๋ ๊ฒ ์๋๋ผ "์๋"๋ง ๋๋ ๊ฒ์ด๋ผ
reloadData() ยท loadMore() ๊ฐ์ ๋ช
์์ ํธ์ถ์ ๊ทธ๋๋ก ๋์ํ๊ณ ,
์ ๋ ฌยทํํฐ ์๋ ์ฌ์กฐํ๋ ํ ๋ฒ์ด๋ผ๋ ์กฐํํ ๋ค๋ถํฐ๋ ํ์์ฒ๋ผ ๋์ํฉ๋๋ค.
setDataSource()๋ ์ ์์ค๊ฐ autoLoad: false๋ฉด
๊ต์ฒด๋ง ํ๊ณ ์กฐํํ์ง ์์ต๋๋ค.
Infinite Scroll (infiniteScroll)
infiniteScroll: true | { threshold, pageSize }๋ ๋ฐ๋ฅ ๊ทผ์ฒ์ ๋ฟ์ผ๋ฉด
๋ค์ ํ์ด์ง๋ฅผ ์๋์ผ๋ก ์กฐํํด ๊ธฐ์กด ํ ๋ค์ ์ด์ด ๋ถ์
๋๋ค(๊ต์ฒด๊ฐ ์๋๋๋ค).
dataSource๊ฐ ํ์ํ๋ฉฐ ํ์ด์ UI์๋ ๋ฐฐํ์
๋๋ค โ
๋์ ํ๋จ ์ํ ๋ฐ๊ฐ ๋ถ๋ฌ์ค๋ ์ค / N๊ฑด ๋ถ๋ฌ์ด / ๋ง์ง๋ง ํ์ด์ง๋ฅผ ์๋ฆฝ๋๋ค.
๋ ํ์ ์ ์๋ฒ๊ฐ ์ค ํ๋๊ทธ(last ยท
lastPage ยท isLast ยท
hasMore ยท hasNext)๊ฐ ์ต์ฐ์ ์ด๊ณ ,
์์ผ๋ฉด total โ ์์ ๊ฑด์ ์์ผ๋ก ์ถ๋ก ํฉ๋๋ค.
์ด ๋ฐ๋ชจ ์๋ฒ(/api/employees-infinite)๋ ์ด๊ฑด์๋ฅผ ์ฃผ์ง ์๊ณ
last๋ง ์ฃผ๋ฏ๋ก, ๋ง์ง๋ง ํ์ด์ง ํ์๊ฐ ์์ ํ ๊ทธ ํ๋๊ทธ์์ ๋์ต๋๋ค.
์ํ ๋ฐ ์ผ์ชฝ์ ํฌ๊ธฐ ์ ํ์ผ๋ก ํ ๋ฒ์ ๋ฐ์ ํ ์๋ฅผ ๋ฐ๊ฟ ์ ์์ต๋๋ค
(paginationPageSizeOptions๊ฐ ์ ํ์ง, ๋ฐ๊พธ๋ฉด ์์ธ ๊ฒ์ ๋ฒ๋ฆฌ๊ณ ์ ํฌ๊ธฐ๋ก ๋ค์ ๋ฐ์ต๋๋ค).
๋๋ ค๋ฉด infiniteScroll: { pageSizeSelector: false }.
Remote Data + CRUD Staging (์ ๊ท / ์์ / ์ญ์ ์ํ ์ปฌ๋ผ)
์๋ฒ์์ ๋ถ๋ฌ์จ ๋ฐ์ดํฐ๋ฅผ ๋ก์ปฌ์์ ํธ์งํด ๋์๋ค๊ฐ ํ ๋ฒ์ ์ ์ฅํ๋ ์ค๋ฌด ํจํด์
๋๋ค.
์ํ ์ปฌ๋ผ(_rowStatus)์ renderers.tag๋ก ํ์ํ๊ณ โ
์ ๊ท๋ addRow๋ก ์ถ๊ฐ๋ ๋ก์ปฌ ํ,
์์ ์ ์๋ฒ ํ์ ํธ์ง(rowValueChanged)ํ๊ฑฐ๋ ์์ ๋ฒํผ์ ๋๋ฅธ ํ,
์ญ์ ๋ ์๋ฒ ํ์ ์ญ์ ํ์(getRowClass๋ก ์ทจ์์ ).
์ ๊ท ํ์ ์ญ์ ํ๋ฉด ์๋ฒ์ ์๋ ๋ฐ์ดํฐ์ด๋ฏ๋ก ๋ก์ฐ ์์ฒด๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค(removeRows).
์ญ์ ํ์๋ ํ์ beforeCellSave๋ก ํธ์ง์ด ์ฐจ๋จ๋ฉ๋๋ค.
v2.6๋ถํฐ๋ ์ด ํจํด์ด statusColumn / softDelete
์ต์
์ผ๋ก ๋ด์ฅ๋์ด ์๋ Built-in CRUD Staging ์นด๋์ฒ๋ผ ์๋น์ ์ฝ๋ ์์ด ๋์ํฉ๋๋ค โ
์ด ์นด๋๋ ์ต์
์์ด ์ง์ ๊ตฌํํ ๋์ ๋ ์ํผ๋ก ๋จ๊ฒจ๋ก๋๋ค.
์๋ฒ์ฌ์ด๋ row model (Server-Side Row Model)
groupMode: 'server'๋ ๊ทธ๋ฃน ๊ณ์ธต์ ์๋ฒ๊ฐ ๊ณ์ฐํ๊ฒ ํ๊ณ , ๊ทธ๋ฆฌ๋๋
ํผ์น ๊ฒฝ๋ก์ ๋ธ๋ก๋ง ๋ฐ์์จ๋ค. ์์ฒญ์๋ groupBy(๊ทธ๋ฃน ์ถ)์
groupKeys(์ง๊ธ ํผ์น ๋
ธ๋์ ์์ ๊ฐ)๊ฐ ์ค๋ฆฌ๊ณ , ํค๊ฐ ๋ค ์ฑ์์ง๋ฉด ์๋ฒ๊ฐ ๋ฆฌํ ํ์ ์ค๋ค.
๋ธ๋ก์ dataSource.blockSize ๋จ์๋ก ์๋ ค ์ค๊ณ ๋จ์ ๊ฒ์ ‘๋ ๋ณด๊ธฐ’ ํ์ผ๋ก ์ด์ด ๋ฐ๋๋ค.
์๋ ๋ฐ๋ชจ์ ์๋ฒ ๋ฐ์ดํฐ์
์ 50,000ํ์ด์ง๋ง ๊ทธ๋ฆฌ๋๊ฐ ํ ๋ฒ์ ๋ค๊ณ ์๋ ๊ฒ์ ๋ธ๋ก ๋ช ๊ฐ๋ฟ์ด๋ค.
ํด๋ฆฝ๋ณด๋ ยท ๋ด๋ณด๋ด๊ธฐ Clipboard & Export
์์ ๊ณผ ๊ฐ์ ์ฃผ๊ณ ๋ฐ๋ ๊ฒฝ๋ก โ ๋ณต์ฌ/๋ถ์ฌ๋ฃ๊ธฐ, CSVยทExcelยทJSON ๋ด๋ณด๋ด๊ธฐ.
Clipboard Copy & Paste (TSV)
์ ํํ ํ์ Ctrl+C๋ก ์์
ํธํ TSV๋ก ๋ณต์ฌํ๊ณ (์ ํ์ด ์์ผ๋ฉด ํฌ์ปค์ค ์
),
ํฌ์ปค์ค ์
์ ์์์ ์ผ๋ก Ctrl+V๋ก ๋ถ์ฌ๋ฃ์ต๋๋ค โ ํธ์ง ๊ฐ๋ฅํ ์
์๋ง ์ฐ์ด๊ณ
validatorยทbeforeCellSave๋ฅผ ํต๊ณผํ ๊ฐ๋ง ๋ฐ์๋ฉ๋๋ค.
column.suppressCopy๋ก ๋ณต์ฌ์์ ์ ์ธํ ์ปฌ๋ผ์ ์ง์ ํ๊ณ ,
copy() / pasteTsv(text)๋ก ์ฝ๋์์๋ ์ ์ดํฉ๋๋ค.
Cell / Block Selection & Find
cellSelection: true๋ ์
ํด๋ฆญยท๋๋๊ทธยทShift+ํด๋ฆญ/ํ์ดํ๋ก
๋ธ๋ก ๋ฒ์๋ฅผ ์ ํํฉ๋๋ค โ Ctrl+C๋ ๋ฒ์๋ฅผ ๊ทธ๋๋ก TSV๋ก ๋ณต์ฌํ๊ณ
getCellRange()๋ก ๋ฒ์๋ฅผ ์ฝ์ต๋๋ค.
findNext(text)๋ ๋ทฐ์์ ๋ค์ ๋งค์น๋ฅผ ์ฐพ์ ํฌ์ปค์คํ๊ณ (๋์์ ์ฒ์์ผ๋ก ์ํ),
cellContextMenu / headerClicked /
cellKeyDown ์ด๋ฒคํธ๋ก ์ํธ์์ฉ์ ํ์ฅํฉ๋๋ค.
CSV Export
ํํฐยท์ ๋ ฌ์ด ์ ์ฉ๋ ํ์ฌ ๋ทฐ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ๋ด๋ณด๋ ๋๋ค(ํฌ๋งคํฐ ์ ์ฉ, RFC 4180 ์ด์ค์ผ์ดํ).
Excel Export & beforeExport
exportExcel(filename, sheetName)์ ์์กด์ฑ ์์ด ์ง์ง .xlsx ํ์ผ์ ๋ง๋ญ๋๋ค
(๋ฌด์์ถ ZIP + SpreadsheetML โ ํฌ๋งคํฐ ์๋ ์ซ์๋ ์ซ์ ์
๋ก ๋๊ฐ ์์
์์ ๋ฐ๋ก ๊ณ์ฐ ๊ฐ๋ฅ).
beforeExport ์ด๋ฒคํธ๋ก ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ทจ์ํ๊ฑฐ๋ rows/columns/filename์ ๊ฐ๊ณตํ๊ณ ,
column.exportFormatter๋ ํ๋ฉด ํ์์ ๋ค๋ฅธ ๋ด๋ณด๋ด๊ธฐ ์ ์ฉ ํฌ๋งท์ ์ง์ ํฉ๋๋ค.
Styled Excel Export (์คํ์ผยท๋ณํฉ ํฌํจ)
exportExcel()์ด ๊ธฐ๋ณธ์ผ๋ก "๊ทธ๋ฆฌ๋์์ ๋ณด์ด๋ ๋๋ก" ๋ด๋ณด๋
๋๋ค โ
ํค๋ ์คํ์ผ, ๋ค๋จ ๊ทธ๋ฃน ํค๋ ๋ณํฉ, mergeCells ์ธ๋ก ๋ณํฉ, ์ปฌ๋ผ ํญ,
ํ๊ณ ์ (ํค๋+๊ณ ์ ์ปฌ๋ผ). format์ด ์๋ ์ซ์ยท๋ ์ง๋ ๋ฌธ์์ด์ด ์๋๋ผ
์์ ๊ฐ + Excel ์์์ผ๋ก ๋๊ฐ ์์
์์ ๋ฐ๋ก ๊ณ์ฐ๋ฉ๋๋ค.
{ styled: false }๋ ์ด์ (v2.28) ํ๋ ์ธ ์ถ๋ ฅ. ๊ทธ๋ฃน ํ(groupBy ๋ผ๋ฒจยท์ง๊ณ)์ ์์ง ๋ด๋ณด๋ด์ง ์์ต๋๋ค.
Programmatic Navigation & JSON Export
focusCell(rowIndex, field)๋ ํ์ด์ง ์ด๋ยท์คํฌ๋กค์ ํฌํจํด ์
์ ํฌ์ปค์ค๋ฅผ ์ฃผ๊ณ ,
ensureRowVisible(row) / ensureColumnVisible(colId)๋
ํยท์ปฌ๋ผ์ด ๋ณด์ด๋๋ก ์คํฌ๋กคํฉ๋๋ค. getJson()์ ํํฐยท์ ๋ ฌ์ด ์ ์ฉ๋
ํ์ฌ ๋ทฐ๋ฅผ JSON ๋ฌธ์์ด๋ก ๋ฐํํ๊ณ , ์
๋๋ธํด๋ฆญ์ cellDoubleClicked ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํต๋๋ค.
๋ ์ด์์ ยท ์ฑ๋ฅ Layout & Performance
๋๋ ๋ฐ์ดํฐ์ ๊ฐ์ํ์ ๊ทธ๋ฆฌ๋๊ฐ ํ๋ฉด์ ์ฐจ์งํ๋ ๋ฐฉ์.
Row Virtualization โ 100,000 rows
๋ณด์ด๋ ๋ฒ์(ยฑ6ํ ๋ฒํผ)๋ง DOM์ผ๋ก ๋ ๋๋งํด 10๋ง ํ๋ ์ง์ฐ ์์ด ์คํฌ๋กคํฉ๋๋ค.
Column Virtualization โ 300 columns (virtualX)
virtualX: true๋ ๊ฐ๋ก ๋ทฐํฌํธ์ ๋ณด์ด๋ ์ปฌ๋ผ(+๋ฒํผ 2)๋ง ์
์ ๋ ๋๋งํ๊ณ
๋๋จธ์ง๋ ํญ ์คํ์ด์๋ก ๋์ฒดํฉ๋๋ค โ ์๋ฐฑ ๊ฐ ์ปฌ๋ผ์์๋ ํ DOM์ด ๊ฐ๋ณ๊ฒ ์ ์ง๋ฉ๋๋ค.
๊ฐ๋ก ์คํฌ๋กค ์ ์ปฌ๋ผ ์ฐฝ์ด ๊ฐฑ์ ๋๊ณ , ๊ณ ์ (pinned) ์ปฌ๋ผ์ ํญ์ ๋ ๋๋ง๋ฉ๋๋ค.
Pinned Top Rows ยท Wrap Text ยท Auto Height
pinnedTopRows๋ ํค๋ ์๋์ ์คํฌ๋กค๊ณผ ๋ฌด๊ดํ ๊ณ ์ ํ(ํ์ ์ ์ฉ)์ ๋๊ณ
setPinnedTopRows(rows)๋ก ๊ฐฑ์ ํฉ๋๋ค.
column.wrapText + autoRowHeight: true๋
๊ธด ํ
์คํธ๋ฅผ ์ค๋ฐ๊ฟํ๊ณ ํ ๋์ด๋ฅผ ๋ด์ฉ์ ๋ง์ถฐ ๊ณ์ฐํ๋ฉฐ(๊ฐ๋ณ ๋์ด ๊ฐ์ํ),
domLayout: 'autoHeight'๋ ๊ทธ๋ฆฌ๋๊ฐ ๋ด์ฉ ๋์ด๋งํผ ๋์ด๋๊ฒ ํฉ๋๋ค.
Auto-Height Grid (domLayout)
domLayout: 'autoHeight'๋ ์ปจํ
์ด๋ ๋์ด ๋์ ๋ด์ฉ ๋์ด๋งํผ
๊ทธ๋ฆฌ๋๊ฐ ๋์ด๋ฉ๋๋ค โ ์ธ๋ก ์คํฌ๋กค/๊ฐ์ํ๊ฐ ์์ด์ง๋ฏ๋ก ์๋ ๋ฐ์ดํฐ ์ ์ฉ์
๋๋ค.
Fill Parent Height (domLayout: 'fill')
domLayout: 'fill'์ ๊ทธ๋ฆฌ๋๋ฅผ ๋ถ๋ชจ ์ปจํ
์ด๋ ๋์ด์ ์ ํํ ๋ง์ถฅ๋๋ค โ
๋ฐ์ดํฐ๊ฐ ์์ด๋ ์ค์ง ์๊ณ , ๋ง์๋ ๋ถ๋ชจ๋ฅผ ๋์ง ์์ต๋๋ค(๋์น๋ ํ์ ๋ณธ๋ฌธ ์คํฌ๋กค).
flex: 1๋ก ์ก์ ์์ญ์ฒ๋ผ ๋์ด๋ฅผ CSS๋ก ๊ณ์ฐํด ์ฃผ๋ ๋ ์ด์์์ ์ฐ์ธ์.
๊ธฐ๋ณธ๊ฐ 'normal'์ height: 100%๋ผ
๋ถ๋ชจ๊ฐ flex ํญ๋ชฉ์ด๋ฉด ์๋ ์ต์ ํฌ๊ธฐ(min-height: auto)์ ๋ฐ๋ ค
ํ ์๋งํผ ๋์ด๋ ์ ์์ต๋๋ค.
์๋ ๊ฐ์ 400px ๋ถ๋ชจ์ ๋ ๋ชจ๋๋ฅผ ๋๋ํ ๋์์ต๋๋ค โ ํ ์๋ฅผ ๋ฐ๊ฟ ๋ณด์ธ์.
Headerless Grid (showHeader)
showHeader: false๋ ํค๋ ์์ญ ์ ์ฒด(์ ๋ ฌยทํํฐ UI ํฌํจ)๋ฅผ ์จ๊น๋๋ค โ
์ฝ๊ธฐ ์ ์ฉ ๋ฆฌ์คํธ๋ ์ปค์คํ
ํค๋๋ฅผ ์ง์ ๋ง๋ค ๋ ์ฌ์ฉํฉ๋๋ค.
์ํ ยท ๋ฐํ์ ์ ์ด State & Runtime
๋ง๋ ๋ค์ ๋ฐ๊พธ๋ ๊ฒ๋ค โ ์ํ ์ ์ฅยท๋ณต์, ์ต์ ๋ณ๊ฒฝ, ์ด๋ฒคํธ, ์ค๋ฒ๋ ์ด.
Grid State Save & Restore
getState()๋ ์ปฌ๋ผ ์์ยท์จ๊นยทํญ, ์ ๋ ฌ, ํํฐ, ํต ํํฐ, ๊ทธ๋ฃนํ,
ํ์ด์ง ์ํ๋ฅผ JSON ์ง๋ ฌํ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ก ๋ฐํํฉ๋๋ค. localStorage ๋ฑ์ ์ ์ฅํ๋ค๊ฐ
setState(state)๋ก ๋ณต์ํ๊ณ ,
resetState()๋ก ์์ฑ ์์ ์ต์
๊ธฐ์ค์ผ๋ก ๋๋๋ฆฝ๋๋ค
(resetState({ sort: true })์ฒ๋ผ ๋ถ๋ถ ๋ฆฌ์
๋ ๊ฐ๋ฅ).
Partial Refresh ยท Runtime Options ยท Title / Toolbar
refreshCell(row, field) / refreshRow(row) /
refreshColumn(colId)์ ์ ์ฒด ์ฌ๊ณ์ฐ ์์ด ๋ ๋๋ DOM๋ง ๋ค์ ๊ทธ๋ฆฝ๋๋ค
(๋๋ ๋ฐ์ดํฐ์์ ์ค์๊ฐ ๊ฐ ๊ฐฑ์ ์ฉ). setOptions({...})๋ ์ฌ์์ฑ ์์ด
์ต์
์ ๋ฐ๊พธ๋ฉฐ, title ์ต์
๊ณผ toolbar ์ฌ๋กฏ
(์๋น์ DOM ์ฃผ์
)์ผ๋ก ๊ทธ๋ฆฌ๋์ ์๋จ UI๋ฅผ ๋ถ์
๋๋ค.
Utility Options & Events (v2.0)
once(event, fn)(1ํ ํธ๋ค๋ฌ) ยท
setEnabled(bool)(์ ์ฒด ์ธํฐ๋์
์ ๊ธ ์ค๋ฒ๋ ์ด) ยท
column.headerAlign(ํค๋๋ง ๋ค๋ฅธ ์ ๋ ฌ) ยท
showHeader: false(ํค๋ ์จ๊น) ยท
rowValueChanged(ํ ๋จ์ ๋ณ๊ฒฝ ๋ฌถ์ โ ํธ์งยท๋ถ์ฌ๋ฃ๊ธฐยท์ฑ์ฐ๊ธฐ ๊ณตํต) ๋ชจ์์
๋๋ค.
Lifecycle & Cancelable Events
gridReady(์ด๊ธฐ ๋ ๋ ํ 1ํ) ยท dataChanged(ํ ์ถ๊ฐ/์ญ์ /๊ต์ฒด) ยท
viewRendered(๋ชจ๋ refresh ํ) ๋ผ์ดํ์ฌ์ดํด ์ด๋ฒคํธ์,
e.cancel = true๋ก ๋์์ ๊ฑฐ๋ถํ๋
beforeSort / beforeSelectionChange /
beforeCellSave ์ทจ์ ๊ฐ๋ฅ ์ด๋ฒคํธ ๊ท์ฝ์
๋๋ค.
Overlays
๋ก๋ฉ ์คํผ๋ ์ค๋ฒ๋ ์ด์ "No rows to show" ๋น ์ํ.
UI Text Localization (localeText)
๊ทธ๋ฆฌ๋๊ฐ ์ง์ ๊ทธ๋ฆฌ๋ UI ๋ฌธ์์ด(ํํฐ ๋ฉ๋ด ยท ํ์ด์ง๋ค์ด์
ยท ์ค๋ฒ๋ ์ด ยท ๊ทธ๋ฃน ์์ฝ ๋ฑ)์
localeText๋ก ํต์งธ๋ก ๋ฐ๊ฟ๋๋ค. ๋ด์ฅ ๋ก์ผ์ผ
DataGrid.locales.ko / .en์ ๊ทธ๋๋ก ์ฐ๊ฑฐ๋,
๊ทธ ์์ ์ํ๋ ํค๋ง ๋ฎ์ด์ธ ์ ์์ต๋๋ค.
setOptions({ localeText })๋ก ๋ฐํ์ ์ ํ๋ ๋ฉ๋๋ค.
{from} ๊ฐ์ ํ ํฐ์ ๊ฐ์ผ๋ก ์นํ๋๋ฉฐ,
๋ฒ์ญํ์ง ์์ ํค๋ ์์ด ๊ธฐ๋ณธ๊ฐ์ด ๊ทธ๋๋ก ์ฐ์
๋๋ค.
License Key & Evaluation Watermark
ํค ์์ด ์คํํ๋ฉด ์ ๊ธฐ๋ฅ์ด ๋์ํ๋ ํ๊ฐํ โ ๊ฐ๋ฐ ํธ์คํธ(localhost)๊ฐ ์๋ ๊ณณ์์๋
์ฐํ๋จ์ ์ํฐ๋งํฌ๊ฐ ํ์๋ฉ๋๋ค. DataGrid.setLicenseKey(key)๋ก ๋ฑ๋กํ๊ณ
DataGrid.getLicenseInfo()๋ก ํ์ ์ํ๋ฅผ ์ง๋จํฉ๋๋ค.
์ด ๋ฐ๋ชจ๋ ๋ด๋ถ ํ
์ผ๋ก ํธ์คํธ๋ฅผ ๋ฐ๊ฟ๊ฐ๋ฉฐ ์ํฐ๋งํฌยท์ํ ์ ํ์ ๋ณด์ฌ์ค๋๋ค.
๋ ๋๋ฌ Renderers
์ ๊ฐ์ ํ๊ทธยท์ฒดํฌยท์งํ๋ฐ ๋ฑ์ผ๋ก ๊ทธ๋ฆฌ๋ ๋ด์ฅ ๋ ๋๋ฌ.
Built-in Renderers (tag / check / progress)
DataGrid.renderers.tag(colorMap)์ ์ํ ๊ฐ์ ์์ ๋ฐฐ์ง๋ก,
renderers.check()๋ ๋ถ๋ฆฌ์ธ์ โ/โ๋ก,
renderers.progress()๋ 0โ100 ๊ฐ์ ์งํ ๋ฐ๋ก ํ์ํฉ๋๋ค.
๋ ๋๋ฌ๋ ํ์๋ง ๋ฐ๊พธ๋ฉฐ ์ ๋ ฌยทํํฐยท๋ด๋ณด๋ด๊ธฐ๋ ์์ ๊ฐ ๊ธฐ์ค์
๋๋ค.
Select Renderer (DataGrid.renderers.select)
select ์๋ํฐ์ ์ง๊ฟ ๋ ๋๋ฌ์
๋๋ค โ ์
์๋ ์ฝ๋(value)๊ฐ ์ ์ฅ๋ผ ์์ด๋
cellRenderer: DataGrid.renderers.select()๊ฐ ๊ทธ ์ปฌ๋ผ์
editorOptions์์ label์ ์ฐพ์ ํ์ํฉ๋๋ค.
๋ฐ์ดํฐยท์ ๋ ฌยทํํฐยท๋ด๋ณด๋ด๊ธฐ๋ ์ ์ฅ๋ value ๊ธฐ์ค ๊ทธ๋๋ก์ด๊ณ , ํ์๋ง label๋ก ๋ฐ๋๋๋ค.
๋ชฉ๋ก์ ์๋ ๊ฐ์ ์๋ ํ์๋ก ํด๋ฐฑํ๋ฉฐ, ๋ค๋ฅธ ๋ชฉ๋ก์ ์ฐ๋ ค๋ฉด
DataGrid.renderers.select([{ label, value }, โฆ])์ฒ๋ผ ์ง์ ๋๊ธธ ์ ์์ต๋๋ค.
๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ์์ต๋๋ค.