스키마 정의
차트 노드 타입의 스키마 정의:
{
chart: {
group: 'block',
attrs: {
type: { default: 'bar' },
data: { default: '{}' }
},
}
}모델 표현
모델 표현 예제:
{
type: 'chart',
attrs: {
type: 'bar',
data: JSON.stringify({ labels: ['A', 'B'], values: [1, 2] })
}
}HTML 직렬화
모델을 HTML로 변환:
function serializeChart(node) {
return '<div data-type="chart" data-chart-type="' + node.attrs.type + '">' +
escapeHtml(node.attrs.data) + '</div>';
}HTML 역직렬화
HTML을 모델로 파싱:
function parseChart(domNode) {
return {
type: 'chart',
attrs: {
type: domNode.getAttribute('data-chart-type') || 'bar',
data: domNode.textContent || '{}'
}
};
}뷰 연동
뷰 연동 노트: 이 노드 타입을 뷰 레이어에서 구현할 때 contenteditable 동작, 선택 처리, 이벤트 관리에 특히 주의하세요.
뷰 연동 코드:
// 차트 렌더링
const chart = document.createElement('div');
chart.setAttribute('data-type', 'chart');
chart.setAttribute('data-chart-type', node.attrs.type);
chart.contentEditable = 'false'; // 차트는 일반적으로 렌더링됨
// Chart.js 또는 다른 차트 라이브러리로 렌더링
function renderChart(element) {
const type = element.getAttribute('data-chart-type');
const data = JSON.parse(element.textContent || '{}');
if (window.Chart) {
new Chart(element, {
type: type,
data: data
});
}
}일반적인 문제
일반적인 함정: 이 노드 타입을 구현할 때 자주 발생하는 문제들입니다. 구현 전에 주의 깊게 검토하세요.
일반적인 문제 및 해결 방법:
// 문제: 차트 데이터 검증
// 해결: 차트 데이터 구조 검증
function validateChartData(data, type) {
try {
const parsed = JSON.parse(data);
// 차트 타입에 따라 검증
return parsed.labels && parsed.values;
} catch {
return false;
}
}
// 문제: 차트 크기 조정
// 해결: 반응형 차트 처리
function makeChartResponsive(chart) {
chart.style.width = '100%';
chart.style.height = 'auto';
}구현
완전한 구현 예제:
class ChartNode {
constructor(attrs) {
this.type = 'chart';
this.attrs = {
type: attrs?.type || 'bar',
data: attrs?.data || '{}'
};
}
toDOM() {
const chart = document.createElement('div');
chart.setAttribute('data-type', 'chart');
chart.setAttribute('data-chart-type', this.attrs.type);
chart.textContent = this.attrs.data;
return chart;
}
static fromDOM(domNode) {
return new ChartNode({
type: domNode.getAttribute('data-chart-type') || 'bar',
data: domNode.textContent || '{}'
});
}
}