DHTMLX Gantt em LWC
Estou implementando o DHTMLX Gantt Chart no LWC. Estou tentando chamar um método LWC a partir da função de biblioteca de gantt, mas não está funcionando.
Aqui está o código:
<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);
}
O openModalmétodo não é chamado porque thisnão é uma referência válida na biblioteca de gantt. Eu tentei document.getElementByIdque também não está funcionando. Quais são as maneiras de fazer isso?
Respostas
Quando você tenta usar thisem uma callback functionmudança de contexto e você perde a referência à instância da classe, leia aqui
A solução antiga é armazenar uma referência a this(instância de classe) em uma variável separada ( selfno exemplo) e usá-la no retorno de chamada
A solução moderna é usar a função Arrow que não tem thiscontexto próprio e se refere ao contexto da classe
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();
});
});
}