Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ES6 Classes - Calling methods from a click event [duplicate]

I am new to ECMA classes.

In the following code, I have built a button class that is working fine. Now I am trying to call the prev_image() method from inside the click eventlistener. I know 'this' refers to the button instance but am not sure how to call a method from the Gallery class. Thanks for any help.

class Gallery{

    constructor(){
    }

    draw(){

        //build button
        prevbtn.draw();

        //button listener
        document.getElementById('prevbtn').addEventListener('click', function(){
            this.prev_image();   <--- this errors out
            console.log('pressed'); <--this works
        });

    }

    prev_image(){
        console.log('previous image!');
    }

}
like image 278
barrylachapelle Avatar asked Mar 22 '18 07:03

barrylachapelle


2 Answers

document.getElementById('prevbtn').addEventListener('click', ()=>{
            this.prev_image();   
            console.log('pressed');
        });

Use the arrow function here.Arrow function does not have its own this it uses this from the code that contains the Arrow Function

like image 64
Saikat Hajra Avatar answered Nov 15 '22 12:11

Saikat Hajra


Try it by binding the context using .bind(this)

class Gallery {

  constructor() {}

  draw() {

    //build button
    //prevbtn.draw();

    //button listener
    document.getElementById('prevbtn').addEventListener('click', function() {
      this.prev_image();
      console.log('pressed');
    }.bind(this));

  }
  // prevbtn.draw(){
  //console.log('prev btn')
  //}

  prev_image() {
    console.log('previous image!');
  }

}

var x = new Gallery();
x.draw();
<button id='prevbtn'>Click</button>
like image 25
brk Avatar answered Nov 15 '22 12:11

brk