Tengo dos clases: "Empresa" y "Empleados".
Ya he creado todos los objetos "Empresa", y ahora quiero crear todos los objetos "Empleado". Dado que necesito hacer una llamada Ajax para obtener los datos de los empleados y luego asociar a cada empleado con la empresa para la que trabaja, mi enfoque es el siguiente:
getEmployeeData . Esto se ejecutará como un detector de eventos de clic adjunto a cada casilla de la empresa, por lo que un usuario verá a los empleados de la empresa cuando haga clic en la casilla de la empresa.populateEmployees(ajaxResult) , pasando los datos de nuestra llamada API.this.employees = []; . Es por eso que estamos haciendo todo esto como métodos de clase en la clase Company. Ok, ahora, por alguna razón, cuando intento ejecutar el paso n. ° 2, falla y dice this.populateEmployees is not a function . Mi primer pensamiento fue que debe ser un problema de alcance, que el método de "éxito" en la llamada ajax no podía acceder a los otros métodos de clase... pero eso no tiene ningún sentido ya que estoy usando el alcance léxico. Además, he usado este patrón varias veces antes y siempre ha funcionado. Incluso estoy viendo otros ejemplos de esto en mi código para otros proyectos, y todo funciona, así que no puedo entender por qué recibo este error ahora. Vea a continuación el código (simplificado por brevedad)
class Employee { constructor(employeeOptions) { this.name = employeeOptions.name; this.company = employeeOptions.company; } } class Company { constructor(companyOptions) { this.companyName = companyOptions.companyName; this.employees = []; this.newCompanyBoxElement = document.createElement("div"); } attachEventListeners(){ this.newCompanyBoxElement.addEventListener("click", this.getEmployeeData); } getEmployeeData() { //send the request to the server and process the results $.LoadingOverlay("show"); $.ajax({ type: "GET", url: getURL, dataType: "JSON", data: { sessionToken: sessionToken, subjectId: subjectId, resolveType: false, }, // process the returned result of the Ajax call success: (ajaxResult) => { // Call function to populate triggered filter boxes // !! this is where things break this.populateEmployees(ajaxResult); }, complete: () => { // Hide loading overlay $.LoadingOverlay("hide"); }, //handle failure error: (error) => { console.log(error); }, }); } // Function to populate employee objects, invoked by the API call above populateEmployees(ajaxResult) { // instantiate objects console.log("populate employees function"); for (let item of ajaxResult) { let newEmployee = new Employee({ name: item.name, company: this.companyName, }); // Add employee to array of employees associated with company this.employees.push(newEmployee); } } }Este fue un problema de alcance, como señaló @wahwahwah. Necesitaba agregar una flecha gruesa a la definición del detector de eventos para darle alcance léxico:
Código antiguo:
attachEventListeners(){ this.newCompanyBoxElement.addEventListener("click", this.getEmployeeData); }Nuevo código (en funcionamiento):
attachEventListener() { this.newFilterGroupBox.addEventListener("click", () => { this.getEmployeeData(); });