Как связать событие с ООП JS

1

Мне нужно связать событие Blur с методом с JS и получить данные объекта. Вот что я получил:

class TestClass {
    constructor(input) {
        this.inputTest = input;

        this.objectTest = {
            1: "one",
            2: "two",
            3: "three"
        }

        this.isBinded = false;
    }

    test() {
        if(!this.isBinded) {
            this.inputTest.addEventListener("blur", function( event ) {
                alert("Test Event");

                // I need to access to Object Scope, but seems not to be working
                console.log(this.objectTest);
            });
        }

        this.isBinded = true;
    }
}

var test = new TestClass(document.querySelector("input"));
test.test();

Итак, это простой пример того, что мне нужно. У меня есть один вход, и когда я инициализирую класс, я связываю событие blur. Когда я пытаюсь это сделать, он просто показывает мне предупреждение, поэтому, похоже, он работает.

Однако, похоже, он не может получить доступ к области объекта, потому что он не возвращает мне this.objectTest объекта из области объекта.

Может кто-нибудь мне помочь? Спасибо

  • 0
    .bind(this) developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Или используйте функцию стрелки, которая примет область действия метода, в котором она была создана.
  • 3
    это внутри обработчика событий не экземпляр вашего класса, а объект события.
Показать ещё 1 комментарий
Теги:
ecmascript-6

2 ответа

0

Однако, похоже, он не может получить доступ к области объекта, потому что он не возвращает мне пример this.objectTest объекта из области объекта

Да, действительно, в addEventListener this относится к input которому вы прикрепляете событие, поэтому this.objectTest будет undefined, поскольку он не ссылается на objectTest объекта objectTest класса.

Что вам нужно сделать, это сделать ссылку на ваш класс this, так что вы можете получить доступ к нему внутри обратного вызова, вы можете присвоить другой переменной, как это:

test() {
 var _self = this;
    if(!this.isBinded) {
        this.inputTest.addEventListener("blur", function( event ) {
            alert("Test Event");

            // I need to access to Object Scope, but seems not to be working
            console.log(_self.objectTest);
        });
    }

    this.isBinded = true;
}

Демо - версия:

Вот демо, показывающее, как это работает.

class TestClass {
  constructor(input) {
    this.inputTest = input;

    this.objectTest = {
      1: "one",
      2: "two",
      3: "three"
    }

    this.isBinded = false;
  }



  test() {
    var _self = this;
    if (!this.isBinded) {
      this.inputTest.addEventListener("blur", function(event) {
        alert("Test Event");

        // I need to access to Object Scope, but seems not to be working
        console.log(_self.objectTest);
      });
    }

    this.isBinded = true;
  }
}

var test = new TestClass(document.getElementById("js-test"));
test.test();
Check it : <input id="js-test" />
0

Поскольку вы используете регулярную функцию в addEventListener, она восстанавливает это значение с помощью элемента inputTest. Вам нужно использовать функцию стрелки, чтобы сохранить это как объект класса. Как это:

this.inputTest.addEventListener("blur", ( event ) => {
            alert("Test Event");

            // I need to access to Object Scope, but seems not to be working
            console.log(this.objectTest);
        });

Ещё вопросы

Сообщество Overcoder
Наверх
Меню