代码之家  ›  专栏  ›  技术社区  ›  barrylachapelle

ES6类-从单击事件调用方法[重复]

  •  5
  • barrylachapelle  · 技术社区  · 6 年前

    我是ECMA课程的新手。

    在下面的代码中,我构建了一个运行良好的button类。现在,我试图从click eventlistener内部调用prev\u image()方法。我知道“this”指的是button实例,但不确定如何从Gallery类调用方法。谢谢你的帮助。

    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!');
        }
    
    }
    
    3 回复  |  直到 6 年前
        1
  •  13
  •   Saikat Hajra    6 年前
    document.getElementById('prevbtn').addEventListener('click', ()=>{
                this.prev_image();   
                console.log('pressed');
            });
    

    此处使用箭头功能。箭头函数没有自己的 this 它使用 来自包含箭头函数的代码

        2
  •  3
  •   brk    6 年前

    通过使用绑定上下文进行尝试 .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>
        3
  •  0
  •   cbll    6 年前

    对于这样的函数,您需要绑定 this 。但是,请将该函数更改为箭头函数:

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

    它应该会起作用。您不再需要绑定 ,而且它也干净多了。