How do you remove an event listener that uses “this” in TypeScript?

后端 未结 3 1268
星月不相逢
星月不相逢 2021-02-12 11:28

In JavaScript, for an event handler that needs access to private members and functions, I can rely on the function scope of those to be accessible within my event handler functi

3条回答
  •  耶瑟儿~
    2021-02-12 12:15

    First, JavaScript and TypeScript behave the exact same way even if you write like that:

    theElement.addEventListener("click", onClick);
    

    Second, this is how you can retain a reference to an anonymous function:

    var f = (event) => this.onClick(event);
    theElement.addEventListener("click", f);
    // later
    theElement.removeEventListener("click", f);
    

    If you're dealing with event listeners, there's a useful pattern for your class methods to be bound:

    class MyClass {
        init(theElement) {
            theElement.addEventListener("click", this.onClick);
            theElement.addEventListener("click", this.onClick2);
        }
        print() {
            console.log("print");
        }
        onClick() {
            this.print() // possible error (`this` is not guaranteed to be MyClass)
        }
    
        onClick2 = () => {
            this.print() // no error, `this` is guaranteed to be of type MyClass
        }
    }
    

    Keep in mind, however, that this code will create a separate function onClick2 for every object of class MyClass. That can negatively affect your memory usage, if you create lots of MyClass instances and rarely use their onClick listeners.

提交回复
热议问题