HTML5 기반 라이브러리 인 chartjs 를 사용하여 Bootstrap 모달 본문 내부에 차트를 동적으로 그립니다. 모든 것이 정상이며 올바른 데이터와 레이블 배열이 전달되고 캔버스 HTML 노드가 생성되었음을 볼 수 있지만이 오류가 발생합니다.
Uncaught TypeError: Cannot read property 'offsetWidth' of undefined
이 함수를 너무 일찍 호출하고 있다고 생각했습니다.
new Chart(--> HTML node <--).get(0).getContext("2d").Bar(--> data <--);
그래서 2 초 정도 캔버스 HTML 노드를 추가 한 후 함수를 호출하기 위해 setTimeout () 블록 에 넣었 지만 여전히 오류가 발생하고 차트를 볼 수 없습니다.
다음은 완전한 코드 ( github , Dropbox )이며 여기에 차트 libraray라고 부르는 부분이 있습니다.
document.getElementById("modalBody").appendChild(canvasElement);
setTimeout(function () {
var ctx = document.getElementsByTagName("canvas")[0];
var myNewChart = new Chart(ctx).get(0).getContext("2d").Bar(finalData);
return finalData;
}, 2000);
나는 모두 변경 무엇의 기본 contextualizeForType2()
과 contextualizeForType3()
같은 다음과 같습니다 :
new Chart(ctx.getContext('2d')).Bar(finalData);
뒤에 var ctx = ...
있습니다. 그러나 모달이 아직 표시되지 않았기 때문에 높이와 너비가 0입니다.shown.bs.modal
하려면 모달 애니메이션이 완료되면 트리거 되는 이벤트에 바인딩해야합니다 . 해당 이벤트 처리기 내부에서 차트를 생성합니다. 까다로운 부분은 동일한 모달을 재사용하는 두 가지 다른 질문이 있기 때문입니다. 그래서 .typeX
모달이 숨겨 질 때 이벤트 등록을 취소 하는 추가 네임 스페이스를 추가했습니다 .두 번째 요점이 혼란 스럽다는 것을 알고 있지만 코드가이를 해결하기를 바랍니다.
var ctx = document.getElementsByTagName("canvas")[0];
$('#myModal').on({
'shown.bs.modal.type2': function() {
new Chart(ctx.getContext("2d")).Bar(finalData);
},
'hidden.bs.modal.type2': function() {
this.off('.type2');
}
});
즉, 일단 모달이 숨겨지면 다른 유형에 대해 동일한 모달이 표시 될 때이 두 함수가 다시 실행되지 않습니다. 또한 버튼을 클릭 할 때마다 새 핸들러를 추가하기 때문에 필요한 것보다 더 많은 차트를 만들지 않아도됩니다.
나는 더 많은 플레이를contextualizeForType2()
했고 contextualizeForType3()
, 그리고 둘 다에서 호출 할 수있는 단일 함수로 코드를 리팩토링 하고 finalData
. 이것은 모든 캔버스와 차트 초기화 코드를 한곳에 남겨두고 큰 기능을 다소 단순화하고 유지 관리를 더 쉽게 만드는 장점이 있습니다.
기능은 다음과 같습니다.
function showModalChart(data) {
var canvasElement = document.createElement("CANVAS");
canvasElement.setAttribute("width", "400");
canvasElement.setAttribute("height", "400");
document.getElementById("modalBody").appendChild(canvasElement);
var ctx = document.getElementsByTagName("canvas")[0];
$('#myModal').off('.modalchart').on('shown.bs.modal.modalchart', function () {
new Chart(ctx.getContext('2d')).Bar(data);
});
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다