Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

344
Views
Javascript: ¿el método de clase AJAX no puede invocar otros métodos de clase desde la función 'Éxito'?

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:

  1. Cree un método de clase Company que haga que Ajax llame a 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.
  2. Desde el método de "éxito" de la llamada Ajax, llame a otro método de clase populateEmployees(ajaxResult) , pasando los datos de nuestra llamada API.
  3. A medida que se instancian los objetos de empleado, se agregarán a la lista de empleados de la empresa asociada 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); } } }
over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

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(); });
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!