无法读取 undefined 的属性(在构造函数内部)

Cannot read properties of undefined (Inside a Constructor)

提问人:Eder Pagliotto 提问时间:10/6/2022 最后编辑:Michael M.Eder Pagliotto 更新时间:10/6/2022 访问量:141

问:

我正在从 The Odin Project 构建一个库应用程序,当我尝试使用单击事件更改“未读”读取“的读取状态时,会发生此错误。 错误发生在第 88 行,读取状态值。我该如何解决这个问题? 谢谢。

console.log(
  "What is the toggle initial value?...",
  myLibrary[parseInt(retrieveBookToToggle)].status
);

let myLibrary = [];
const btnAdd = document.querySelector("btn-add");

//Object Constructor
class Book {
  constructor(title, author, pages, status) {
    this.title = title;
    this.author = author;
    this.pages = pages;
    this.status = status;
  }

  //Add a new book to array
  function addBookToLibrary(title, author, pages, status) {
    let book = new Book(title, author, pages, status);
    myLibrary.push(book);
    displayBooksOnPage()
  }


  //Display array to card
  function displayBooksOnPage() {
    const books = document.querySelector(".books-container");

    //remove displayed cards before loop array
    const removeDivs = document.querySelectorAll(".card");
    console.log("Show me the node count of the current card divs........", removeDivs);
    for (let i = 0; i < removeDivs.length; i++) {
      removeDivs[i].remove();
    }

    //Loop Library array and display to the cards
    let index = 0;
    myLibrary.forEach(myLibrarys => {
      const card = document.createElement("div");
      card.classList.add("card");
      books.appendChild(card);

      //remove book button
      const removeBookButton = document.createElement("button");
      removeBookButton.classList.add("remove-book-button");
      removeBookButton.textContent = "Remove Book";
      console.log("show me my currentnarray objects inside of foreach........", myLibrary);

      //link data attribute of the remove button to the array and card
      removeBookButton.dataset.linkedArray = index;
      index++;
      console.log("show me dataset link back to the array...", removeBookButton.dataset.linkedArray);
      card.appendChild(removeBookButton);

      //start event listener/remove array item from array and card from parent div via data link
      removeBookButton.addEventListener("click", removeBookFromLibrary);

      function removeBookFromLibrary() {
        let retrieveBookToRemove = removeBookButton.dataset.linkedArray;
        console.log("attempting to remove array item via data attribute...", parseInt(retrieveBookToRemove));
        myLibrary.splice(parseInt(retrieveBookToRemove), 1);
        card.remove();
        displayBooksOnPage;
      }

      const readStatusButton = document.createElement("button");
      readStatusButton.classList.add("read-status-button");
      readStatusButton.textContent = "Change Status";

      readStatusButton.dataset.linkedArray = index;
      console.log("show dataset link back to the array for read status button", readStatusButton.dataset.linkedArray);
      card.appendChild(readStatusButton);

      readStatusButton.addEventListener("click", toggleReadStatus);

      function toggleReadStatus() {
        let retrieveBookToToggle = readStatusButton.dataset.linkedArray;
        Book.prototype = Object.create(Book.prototype);
        const toggleBook = new Book();
        console.log("what's the toggle initial value? ", myLibrary[parseInt(retrieveBookToToggle)].status);
        if (myLibrary[parseInt(retrieveBookToToggle)].status == "Read") {
          toggleBook.status = "Not Read";
          myLibrary[parseInt(retrieveBookToToggle)].status = toggleBook.status;
        } else if (myLibrary[parseInt(retrieveBookToToggle)].status == "Not Read") {
          toggleBook.status = "Read";
          myLibrary[parseInt(retrieveBookToToggle)].status = toggleBook.status;
        }
        displayBooksOnPage();
      }



      for (let key in myLibrarys) {
        const para = document.createElement("p");
        para.textContent = (`${myLibrarys[key]}`);
        card.appendChild(para);
      }
    })
  }

  const addBookButton = document.querySelector(".btn-add");
  addBookButton.addEventListener("click", displayTheForm);

  function displayTheForm() {
    document.getElementById("books-form").style.display = "";
  }

  const submitButton = document.querySelector(".btn-add");
  submitButton.addEventListener("click", intakeFormData);

  function intakeFormData() {
    let Title = document.getElementById("title").value;
    let Author = document.getElementById("author").value;
    let Pages = document.getElementById("pages").value;
    let Status = document.getElementById("status").value;

    if ((Title == "") || (Author == "") || (Pages == "") || (Status == "")) {
      return;
    }

    addBookToLibrary(Title, Author, Pages, Status);

    document.getElementById("add-book").reset();
  }

  const clearButton = document.getElementById("btn-reset");
  clearButton.addEventListener("click", clearForm());

  function clearForm() {
    document.getElementById("add-book").reset();
  }

JavaScript 构造函数 onclick undefined this

评论

0赞 Aastha Bist 10/6/2022
嗨,你能把你的问题简化为重要的部分吗?
0赞 Aastha Bist 10/6/2022
此外,在实际使用函数之前,请尝试定义该函数。
0赞 GrafiCode 10/6/2022
const clearButton = document.getElementById("btn-reset");应该是const clearButton = document.querySelector(".btn-reset");
0赞 Eder Pagliotto 10/6/2022
我已经编辑了,并将我的代码从构造函数到函数更改为更改我的阅读按钮状态,但是当我单击按钮时,状态被标识为未定义。

答: 暂无答案