Не удается удалить вновь созданный элемент списка без обновления страницы и повторной попытки ES6 - PullRequest
0 голосов
/ 04 декабря 2018

Некоторый контекст: я пытаюсь завершить сборку функции удаления моего минимального приложения для создания заметок.

Каждый раз, когда я создаю новую заметку, она будет появляться в конце моего списка заметок.,Однако, если я попытаюсь удалить только что созданную заметку, она не будет работать.Я должен обновить страницу и попробовать еще раз, чтобы она заработала.

Я получаю эти две ошибки:

"Uncaught TypeError: Невозможно прочитать свойство 'parentNode' с нулевым значением в HTMLUListElement."

"УДАЛИТЬ http://localhost:3000/api/v1/notes/undefined 404 (не найдено)"

В противном случае я могу без проблем удалить любую другую заметку.

Вот мой код js:

  // display list of notes on the side

  const noteContainer = document.querySelector(".column is-one-quarter")
  const noteList = document.querySelector(".menu-list")

  fetch('http://localhost:3000/api/v1/notes')
  .then(function(response) {
    return response.json();
  })
  .then(function(notes) {
    notes.forEach(function(note) {
      noteList.innerHTML += `<li id="list-item" data-id=${note.id}><a id="note" data-id=${note.id} class="menu-item">${note.title}</a><i id="delete" data-id=${note.id} class="fas fa-minus-circle has-text-grey-light hvr-grow"></i></li>`
    })
  })

  // display details of each note

    const noteDetail = document.querySelector(".note-detail")

    noteList.addEventListener('click', function(event) {
      if (event.target.className === "menu-item") {
        fetch(`http://localhost:3000/api/v1/notes/${event.target.dataset.id}`)
        .then(function(response) {
          return response.json()
        })
        .then(function(note) {
            noteDetail.innerHTML = `<h1 contenteditable="true" id="title" data-id=${note.id} class="subtitle is-2">${note.title}</h1><p contenteditable="true" id="body" data-id=${note.id} class="subtitle is-6">${note.body}</p><a id="save" data-id=${note.id} class="button is-small">Save</a>`
        })
       }
      })

    // i should be able to edit the title and body of a note when i click
    // on it and it should save when i click on the button.

         noteDetail.addEventListener('click', function(event) {
           if (event.target.id === "save") {
             const noteId = event.target.dataset.id
             const editTitleInput = document.querySelector(`h1[data-id="${noteId}"]`)
             const editBodyInput = document.querySelector(`p[data-id="${noteId}"]`)
             const singleNote = document.querySelector(`a[data-id="${noteId}"]`)
             fetch(`http://localhost:3000/api/v1/notes/${noteId}`, {
               method: "PATCH",
               headers: {
                 'Content-Type': 'application/json',
                 'Accepts': 'application/json'
               },
               body: JSON.stringify({
                 title: editTitleInput.innerText,
                 body: editBodyInput.innerText
               })
             }).then(function(response) {
               return response.json()
             }).then(function(note) {
                    singleNote.innerText = editTitleInput.innerText
                })
              }
            })


    // when i click on the button, a form with a title and body input
    // should display on the right.

      const newNoteButton = document.querySelector("#create")

      newNoteButton.addEventListener('click', function(event) {
          fetch("http://localhost:3000/api/v1/notes")
          .then(function(response) {
            return response.json()
          })
          .then(function(note) {
            noteDetail.innerHTML = `<input id="title" class="input subtitle is-5" type="text" placeholder="Title">
            <textarea id="body" class="textarea subtitle is-5" placeholder="Body" rows="10"></textarea><a id="add" class="button has-text-black" style="margin-left: 594px;">Add Note</a>`

            // when i click on 'add button', a new note with a title and body
            // should be created and added to the list of notes.

            const noteTitleInput = document.querySelector("#title")
            const noteBodyInput = document.querySelector("#body")
            const addNoteButton = document.querySelector("#add")

            addNoteButton.addEventListener('click', function(event) {
              // event.preventDefault()
              fetch('http://localhost:3000/api/v1/notes', {
                method: "POST",
                headers: {
                  'Content-Type': 'application/json',
                  'Accepts': 'application/json'
                },
                body: JSON.stringify({
                  title: noteTitleInput.value,
                  body: noteBodyInput.value
                })
              }).then(function(response) {
                return response.json()
              }).then(function(note) {
                noteList.innerHTML += `<li data-id=${note.id}><a id="note" data-id=${note.id} class="menu-item">${note.title}</a><i id="delete" class="fas fa-minus-circle has-text-grey-light hvr-grow"></i></li>`
              })
            })

          })
        })


        // i should be able to delete a note when i click on the button.

        noteList.addEventListener('click', function(event) {
          // event.preventDefault()
          if (event.target.id === "delete") {
            const noteId = event.target.dataset.id
            // const noteListItem = document.querySelector("#list-item")
            const noteListItem = document.querySelector(`li[data-id="${noteId}"]`)
            const singleNote = document.querySelector(`a[data-id="${noteId}"]`)
            fetch(`http://localhost:3000/api/v1/notes/${noteId}`, {
              method: "DELETE",
            })
            // debugger
           // lastNote = noteList.lastElementChild
           // noteList.removeChild(lastNote)
           // singleNote.parentElement.remove()
           noteListItem.parentNode.removeChild(noteListItem)
           noteDetail.innerHTML = ""
           }
         })

Вот мой HTML-код:

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.css">
    <link href="css/hover.css" rel="stylesheet" media="all">
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.5.0/css/all.css" integrity="sha384-B4dIYHKNBt8Bc12p+WXckhzcICo0wtJAoU8YZTY5qE0Id1GSseTk6S+L3BlXeVIU" crossorigin="anonymous">
    <link rel="stylesheet" href="css/note.css">
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>

    <h1 class="title is-1">Jot</h1>

<div class="columns">

  <div class="column is-one-quarter">
    <p class="menu-label" style="font-size:15px;">
      Notes <i id="create" class="fas fa-plus-circle has-text-grey-light hvr-grow" style="margin-left: 10px; width: 20px; height: 30px; font-size: 24px;"></i>
    </p>
      <ul class="menu-list">

      </ul>
 </div>

  <div class="column is-three-fifths">
    <div class="note-detail">

    </div>
  </div>

  <div class="column">

  </div>

</div>

    <script src="index.js"></script>
  </body>
</html>

Любая помощь будет принята с благодарностью.:)

1 Ответ

0 голосов
/ 06 декабря 2018

Вы вкладываете строки в эти две строки:

const noteListItem = document.querySelector(`li[data-id="${noteId}"]`)
const singleNote = document.querySelector(`a[data-id="${noteId}"]`)

Ваш шаблонный литерал создает строку, и вы помещаете ее в кавычки.Например, если ваш noteId скажет 12.ваш код заканчивается следующим образом:

const noteListItem = document.querySelector("li[data-id="'12'"]")
const singleNote = document.querySelector("a[data-id="'12'"]")

Я не на 100% уверен, что это ваша проблема, но это первое, что мне показалось.

Вы можете проверить MDN наосвежить свои Шаблонные литералы (Шаблонные строки) .

...