DHTMLX Гантта в LWC
Я реализую диаграмму Ганта DHTMLX в LWC. Я пытаюсь вызвать метод LWC из функции библиотеки Ганта, но он не работает.
Вот код:
<template>
<input type="hidden" id="hidden-task-data" onclick={openModal}/>
<div class="thegantt" lwc:dom="manual" style='width:100%;'></div>
</template>
this.isModalOpen = false;
renderedCallback() {
Promise.all([
loadScript(this, DHTMLX7 + '/codebase/dhtmlxgantt.js'),
loadStyle(this, DHTMLX7 + '/codebase/dhtmlxgantt.css')
]).then(() => {
const root = this.template.querySelector('.thegantt');
root.style.height = "300px";
const gantt = window.Gantt.getGanttInstance();
//This method is called when a user double clicks on a task bar of the chart
gantt.attachEvent("onTaskDblClick", function(id, e) {
/* As per LWC's documentation, this doesn't work
let taskInput = document.getElementById("hidden-task-data");
taskInput.value = e;
taskInput.click();
*/
this.openModal(); //This doesn't work
return true;
});
});
}
openModal() {
this.isModalOpen = true;
console.log(this.isModalOpen);
}
openModalМетод не вызывается , потому что thisне является допустимым ссылка в библиотеке Ганта. Я пробовал, document.getElementByIdчто тоже не работает. Как я могу этого добиться?
Ответы
Когда вы пытаетесь использовать thisв callback functionконтексте изменения, и вы теряете ссылку на экземпляр класса, прочтите здесь
Старое решение - сохранить ссылку на this(экземпляр класса) в отдельной переменной ( selfв примере) и использовать ее в обратном вызове
Современное решение - использовать функцию стрелки, которая не имеет собственного thisконтекста и относится к контексту класса.
renderedCallback() {
Promise.all([
loadScript(this, DHTMLX7 + '/codebase/dhtmlxgantt.js'),
loadStyle(this, DHTMLX7 + '/codebase/dhtmlxgantt.css')
]).then(() => {
const gantt = window.Gantt.getGanttInstance();
// Using Arrow function
gantt.attachEvent("onTaskDblClick", (id, e) => {
this.openModal();
});
// Storing reference of this in another variable
const self = this;
gantt.attachEvent("onTaskDblClick", function(id, e) {
self.openModal();
});
});
}