아래 코드는 실제 라이브러리가 프로젝트에 설치되어 있을 때 그대로 사용할 수 있는 참고 구현입니다.
(해당 라이브러리들은 이 문서에 포함되어 있지 않으므로 이 페이지에서는 실행되지 않습니다.)
#### AUIGrid
syn.$bind.registerAdapter('auigrid', {
get: function (el) { return el._auiGrid.getGridData(); },
set: function (el, value) { el._auiGrid.setGridData(value || []); },
on: function (el, handler) {
var fire = function () { handler(el._auiGrid.getGridData()); };
el._auiGrid.bind('cellDataChanged', fire);
el._auiGrid.bind('rowAdded', fire);
el._auiGrid.bind('rowRemoved', fire);
},
off: function (el) {
el._auiGrid.unbind('cellDataChanged');
el._auiGrid.unbind('rowAdded');
el._auiGrid.unbind('rowRemoved');
}
});
// 초기화: 그리드 인스턴스를 엘리먼트에 보관해두면 어댑터에서 참조하기 편하다
var gridEl = document.getElementById('auiGridContainer');
gridEl._auiGrid = new AUIGrid({ id: 'auiGridContainer', dataSource: [], columnLayout: [ /* ... */ ] });
<div id="auiGridContainer" syn-bind="adapter(auigrid):items"></div>
#### Handsontable
syn.$bind.registerAdapter('handsontable', {
get: function (el) { return el._hot.getSourceData(); },
set: function (el, value) { el._hot.loadData(value || []); },
on: function (el, handler) {
el._hot.addHook('afterChange', function (changes, source) {
if (source === 'loadData') return; // set()으로 인한 되먹임(echo) 방지
handler(el._hot.getSourceData());
});
el._hot.addHook('afterCreateRow', function () { handler(el._hot.getSourceData()); });
el._hot.addHook('afterRemoveRow', function () { handler(el._hot.getSourceData()); });
}
});
var hotEl = document.getElementById('hotContainer');
hotEl._hot = new Handsontable(hotEl, {
columns: [ { data: 'title' }, { data: 'qty', type: 'numeric' }, { data: 'done', type: 'checkbox' } ],
rowHeaders: true,
colHeaders: ['상품명', '수량', '완료']
});
<div id="hotContainer" syn-bind="adapter(handsontable):items"></div>
#### tail.select.js
syn.$bind.registerAdapter('tail-select', {
get: function (el) { return el.tail.select.getValue(); },
set: function (el, value) { el.tail.select.setValue(value); },
on: function (el, handler) {
el.addEventListener('change', function () { handler(el.tail.select.getValue()); });
}
});
tail.select('#roleSelect'); // 초기화 시 엘리먼트에 el.tail 참조가 생성된다
<select id="roleSelect" syn-bind="adapter(tail-select):user.role">
<option value="user">일반 사용자</option>
<option value="admin">관리자</option>
</select>
#### daterangepicker (bootstrap-daterangepicker, jQuery 기반)
syn.$bind.registerAdapter('daterangepicker', {
get: function (el) {
var picker = $(el).data('daterangepicker');
return { start: picker.startDate.format('YYYY-MM-DD'), end: picker.endDate.format('YYYY-MM-DD') };
},
set: function (el, value) {
if (!value) return;
var picker = $(el).data('daterangepicker');
picker.setStartDate(value.start);
picker.setEndDate(value.end);
$(el).val(value.start + ' ~ ' + value.end);
},
on: function (el, handler) {
$(el).on('apply.daterangepicker', function (ev, picker) {
handler({ start: picker.startDate.format('YYYY-MM-DD'), end: picker.endDate.format('YYYY-MM-DD') });
});
}
});
$('#dateRange').daterangepicker({ /* 옵션 */ });
<input id="dateRange" type="text" syn-bind="adapter(daterangepicker):period">