Неперехваченная ошибка ссылки: updateIngredient не определен в HTMLButtonElement.editIngredient

#javascript #html #jquery #forms #button

#javascript #HTML #jquery #формы #кнопка

Вопрос:

Не уверен, что я здесь делаю не так, но я пытаюсь создать простую функцию обновления / редактирования, чтобы иметь возможность редактировать ингредиенты, которые существуют в наборе данных. При этом я получаю указанную выше ошибку. Вот мой код:

 deleteIngredient(){
    const ingredientId = this.parentElement.dataset.id
    fetch(`${recipeUrl}/${ingredientId}`, {
        method: "DELETE"
    })
    this.parentElement.remove()
}

updateIngredient(){
    var editForm = document.getElementById("ingredient-input")
    console.log(editForm)
}

editIngredient(){
    var editForm = 
    `<form id="edit-form">
    <input type="text" id="edit-input">
    <input type="submit" value="Edit Ingredient">
    </form>`
    this.parentElement.insertAdjacentHTML('beforeend', editForm)
    console.log(this.parentElement)
    document.getElementById('edit-form')
    editForm.addEventListener("click", updateIngredient)
}


const editBtn = document.createElement('button')
    editBtn.addEventListener("click", this.editIngredient)
    editBtn.innerText = "Edit"
    li.appendChild(editBtn)
    ingredientList.appendChild(li)
 

Что я здесь делаю не так? Это, по крайней мере, не должно вызывать эту ошибку. Пожалуйста, помогите!

Редактировать: обновленный код с помощью onclick избавился от ошибки!

         const editForm = 
        `<form id="edit-form">
        <input type="text" id="edit-input">
        <input type="submit" value="Edit Ingredient" onclick="updateIngredient">
        </form>`
        this.parentElement.insertAdjacentHTML('beforeend', editForm)
        console.log(this.parentElement)
        document.getElementById('edit-form')
        //editForm.addEventListener("click", updateIngredient)
    }
    
   updateIngredient(){
       document.querySelector("data-id")
   }

I could still use help with updateIngredient which will take the ingredient and edit it using the edit form. Any other advice would be so appreciated!

Edit 2: Still feeling a bit lost so here is my full Ingredient class and index.html file

    <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="styles/styles.css">
    <title>Recipe App</title>
</head>
<body>
    <h1>Easy Recipe and Ingredient Saver</h1>
    <br>
    <h2>Instructions:</h2>
    <h3>Enter the name of your recipe below in the top form.</h3> 
    <h3>After creation add all the ingredients for that recipe separately and hit enter to save to the recipe.</h3>
    <div id="container">
        <h4>Create a Recipe:</h4>
        <form id="recipe-form">
            <input type="text" id="recipe-input">
            <input type="submit" value="Create Recipe">
        </form>
        <ul id="recipe-list">
           
        </ul>
    </div>
    <script src='./src/ingredient.js'></script>
    <script src='./src/recipe.js'></script>
    <script src='./src/index.js'></script>
</body>
</html>


    class Ingredient {

    constructor(ingredient) {
        this.recipe_id = ingredient.recipe_id
        this.name = ingredient.name
        this.id = ingredient.id
    }

    static createIngredient(e){
        e.preventDefault()
        const ingredientInput = e.target.children[0].value
        const ingredientList = e.target.nextElementSibling
        const recipeId = e.target.parentElement.dataset.id

        Ingredient.submitIngredient(ingredientInput, ingredientList, recipeId)

        e.target.reset()
    }

    renderIngredient(ingredientList){
        const li = document.createElement('li')
        li.dataset.id = this.recipe_id
        li.innerText = this.name
        
        const deleteBtn = document.createElement('button')
        deleteBtn.addEventListener("click", this.deleteIngredient)
        deleteBtn.innerText = "X"
        li.appendChild(deleteBtn)
        ingredientList.appendChild(li)

        const editBtn = document.createElement('button')
        editBtn.addEventListener("click", this.editIngredient)
        editBtn.innerText = "Edit"
        li.appendChild(editBtn)
        ingredientList.appendChild(li)


    }
    
    static submitIngredient(ingredient, ingredientList, recipeId){
        fetch(ingredientUrl, {
            method: "POST",
            headers: {
                "Content-type": "application/json",
                "Accept": "application/json"
            },
            body: JSON.stringify({
                name: ingredient, 
                recipe_id: recipeId
            })
        }).then(res => res.json())
        .then(ingredient => {
            let newIngredient = new Ingredient(ingredient)
            newIngredient.renderIngredient(ingredientList)
        })
    }

    
    deleteIngredient(){
        const ingredientId = this.parentElement.dataset.id
        fetch(`${recipeUrl}/${ingredientId}`, {
            method: "DELETE"
        })
        this.parentElement.remove()
    }
   

    editIngredient(){
        const editForm = 
        `<form id="edit-form">
        <input type="text" id="edit-input">
        <input type="submit" value="Edit Ingredient" onclick="updateIngredient">
        </form>`
        this.parentElement.insertAdjacentHTML('beforeend', editForm)
        console.log(this.parentElement)
        document.getElementById('edit-form')
        //editForm.addEventListener("click", updateIngredient)
    }
    
   updateIngredient(){
       const ingredientId = this.parentElement.dataset.id
       ingredientId.innerText("")
   }
} 


 

Комментарии:

1. Что произойдет, если вы вызовете его из встроенного действия? (Используйте onclick=»updateIngredient()» в HTML вместо добавления прослушивателя событий.)

2. Конечно, когда вы устанавливаете editForm переменную, замените <input type="submit" value="Edit Ingredient"> на <input type="submit" value="Edit Ingredient" onclick="updateIngredient()"> . Тогда вам не понадобится прослушиватель событий ( editForm.addEventListener("click", updateIngredient) ) .

3. Это сработало, чтобы избавиться от ошибки! Большое вам спасибо! теперь мне просто нужно выяснить, что поместить в updateIngredient, чтобы он редактировал текущие данные. Любой совет по этому поводу случайно?

4. Где вы его обновляете? В DOM?

5. Нет, на веб-странице и на сервере rails. На странице вы можете увидеть список рецептов и последующих ингредиентов, и я хочу иметь возможность редактировать ингредиенты