在类方法中使用事件侦听器调用另一个返回未定义的类方法

Jleibham

我正在学习如何使用javascript类。我在理解如何使事件侦听器调用类中的方法时遇到了一些困难。具体来说,每当我单击click时调用this.infoBoxActive时,该方法中的所有变量都将返回undefined。

我最终想要做的是拥有一个onclick切换方法,onclick在true和false之间切换,然后根据其状态调用infoBoxActive或infoBoxDective。我整天都在尝试代码,尝试各种事情,但似乎引发了我的变量未定义的同一问题。如果我直接调用该方法,那么一切都会很好。

我一直在使用诺言从本地JSON文件中收集数据,但是我不确定如何以解析方式返回Object,所以现在我要从诺言中调用所有新类。我不知道这是否会成为问题的一部分。

我尝试阅读一些相似的帖子,但是我听不懂解决方案,或者与我的确切问题无关,因此,如果这是重复的,我深表歉意。

class EpisodeInfoBox extends Episode {
  constructor({ title, date, description, tracklist } = {}) {
    super({ title, date, description, tracklist })

    this.titleContainer = document.querySelector('.episode-title');
    this.dateContainer = document.querySelector('.episode-date');
    this.descriptionContainer = document.querySelector('.episode-description');
    this.tracklistContainer = document.querySelector('.episode-tracklist');

    this.infoBoxButton = document.getElementById('infoBoxButton');

    this.infoBoxButton.addEventListener('click', this.infoBoxActive);
  }



  infoBoxActive(){
    this.titleContainer.innerHTML = this.title;
    this.dateContainer.innerHTMLs = this.date;
    this.descriptionContainer.innerHTML = this.description;

    // Creates list-items for track list
    let tracklistHTML = '';
    for (let i = 0; i < this.tracklist.length; i++) {
      tracklistHTML += `<li>${this.tracklist[i].song} - ${this.tracklist[i].artist}</li>`;
    }
    this.tracklistContainer.innerHTML = tracklistHTML;
  }
}

我的诺言

export default function service(url) {
  return new Promise(function(res, rej) {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', url);
    xhr.onreadystatechange = handleResponse;
    xhr.onerror = function(error) {
      rej(error)
    }
    xhr.send();

    function handleResponse() {
      if (xhr.readyState === 4) {
        if (xhr.status === 200) {
          var resObject = JSON.parse(xhr.responseText);
          res(resObject)
        } else {
          rej(this.statusText)
        }
      }
    };
  });
}

我的决心

function callService(){
  service('/data/episodes.json')
    .then(retrieveEpisode)
    .then(makeEpisode)
    .catch(function(e) {
      console.log(e)
    });
}

function retrieveEpisode(episodeArray) {
  return episodeArray[0];

}

function makeEpisode(episode){
  let newEpisode = new Episode(episode);
    newEpisode.setEpisodeImage();
  let newAudioPlayer = new AudioPlayer(episode);
  let newEpisodeInfoBox = new EpisodeInfoBox(episode);
}
jfriend00

更改此:

 this.infoBoxButton.addEventListener('click', this.infoBoxActive);

对此:

this.infoBoxButton.addEventListener('click', this.infoBoxActive.bind(this));

调用事件侦听器时,将不会this设置对象的指针,因此infoBoxActive()将使用不适当的值进行调用,this因此您将看不到期望的属性。可以在调用方法之前使用.bind()如上所示重新附加适当的this值。


在Javascript中,当您将this.infoBoxActive参数作为参数传递给函数时,将.infoBoxActive传递对该方法的引用,但与根本没有任何联系this它只是对函数的引用。因此,侦听器然后调用该函数并设置其自己的值,this将不是您的对象。使用,.bind()您可以创建一个函数存根,该存根将this在调用函数时为您设置的值

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

未定义的方法-从另一个文件中调用一个文件中的类

如何为从另一个类引发的事件创建事件侦听器

在 Angular 中使用事件侦听器操作类

使用 Swing 时的 Java 方法 - 可以在同一类的另一个事件方法中调用事件方法吗?

如何从Java中另一个类的事件侦听器中检索值?

Java:使用动作侦听器在该类的对象的另一个类中调用函数

在另一个类的Jbutton数组上使用动作侦听器/ StackOverflowError

如何从另一个类调用方法以在我的ActionListener类中使用

从另一个类调用函数时属性未定义

从 Click 事件方法获取变量并在另一个类中使用它

Javascript 事件侦听器覆盖另一个事件侦听器

ByteBuddy:如何在另一个类中使用自定义方法声明一个类

一个类的多个事件侦听器

在python中使用lambda表达式调用另一个类的方法

尝试调用另一个类中的方法以在 IF 语句中使用

无法在swift中使用委托调用另一个类方法

用类方法调用的Javascript事件侦听器

在 C# 的另一个类中使用方法返回

从另一个类调用类方法

使用main方法从另一个类调用一个类

如何在Lit-HTML中使用事件侦听器添加和删除类?

在另一个类中使用一个类的方法

Python如何在另一个类方法中使用一个类

在另一个类中使用一个类的方法

将函数从一个类传递到另一个类时出现未定义的方法错误

另一个类中的动作侦听器-Java

Java:删除另一个类中的活动键侦听器

php-在另一个使用全局类的类中使用类方法

调用另一个控制器索引时,nil:NilClass的未定义方法“ each”