繁体   English   中英

Function 被多次执行

[英]Function being executed more than once

我无法发现导致 function 多次执行的问题。

下面的代码片段是当页面打开或发生更改时,无论是新数据还是更改数据。 这个function是从银行取数据来展示的,这部分我就不展示了,因为没必要。 显示后,它调用了两个函数,第一个给我带来了问题,更新 function。

function carteProduct_listProducts() {
    let dataProductsDatas = document.getElementById("data_products_datas");

    firebase.database().ref("Products").on("value", snapshot => {
        dataProductsDatas.innerHTML = ""

        snapshot.forEach(element => {
            ...
        });

        // Edit buttons event listener
        // Update
        modalEditProduct()
        

        // Delete
        realtimedb_delete("Products");
    })
}

然后是更新 function,或者在代码中,modalEditProduct。 我为此制作了一个模态,因为我只使用一个模态时遇到了麻烦。 所以,这个 function 在另一个 function 中被调用。 我认为正是因为这个原因,我才给出了这个问题,function 被执行了两次,但是没有,我把 function 拿出来并测试了它。 但问题一直在发生。

然后,当单击编辑按钮时,模式将打开。 因此它执行相同 function 中的一些功能

// Update product
function modalEditProduct() {
    let editBtns = document.querySelectorAll("#data_products_datas .editBtn");
    let productTitleInput = document.querySelector("#modalEditProduct form input[name='productTitle']");
    let productCategoryInput = document.querySelector("#modalEditProduct form select[name='productCategory']");
    let productPriceInput = document.querySelector("#modalEditProduct form input[name='productPrice']");
    let productIngredientsInput = document.querySelector("#modalEditProduct form input[name='productIngredients']");
    let productDescriptionInput = document.querySelector("#modalEditProduct form input[name='productDescription']");
    let editSubmitBtn = document.querySelector("#modalEditProduct form button");
    console.log(editBtns)
    editBtns.forEach(element => {
        element.addEventListener("click", (e) => {
            let key = e.target.id;
            // Open modal
            modal_openModal("modalEditProduct");
            
            // Get the data
            let data = getData(key);

            // putting categories on select
            cartePorudct_puttingCategoriesSelect(productCategoryInput);
            // let children = productCategoryInput.children;
            // console.log(children)
            // for (let i = 0; i < children.length; i++) {
            //     const element = children[i];
            //     console.log(element)
            // }

            // Insert the data in the field/inputs
            setData(data);

            // Submit form
            editSubmitBtn.addEventListener("click", (e) => {
                e.preventDefault();
    
                realtimedb_verification("modalEditProduct", edit_productData, key)
            })
        })
    });

    // Get the data
    function getData(key) {
        let data;
        firebase.database().ref("Products/"+key).on("value", snapshot => {
            data = {
                title: snapshot.val().title,
                category: snapshot.val().category,
                price: snapshot.val().price,
                ingredients: snapshot.val().ingredients,
                description: snapshot.val().description,
            }
        });
        return data;
    }

    // Insert the data in the field/inputs
    function setData(data) {
        productTitleInput.value = data.title;
        // productCategoryInput.value = data.category,
        productPriceInput.value = data.price;
        productIngredientsInput.value = data.ingredients;
        productDescriptionInput.value = data.description;
    }

    // Submit form
    function submitForm(btn, key){
        
    }

    // Data
    function edit_productData(key) {
        let data = {
            title: productTitleInput.value,
            category: productCategoryInput.value,
            price: productPriceInput.value,
            ingredients: productIngredientsInput.value,
            description: productDescriptionInput.value,
        }

        // Update
        realtimedb_update("Products", key, data);
    }
}

无论如何,问题是。 当我打开一个模式,进行更改并保存时,一切都很好。 如果我打开另一个数据的模态,点击提交按钮后,之前的数据也会随着该数据的值而改变。 如果我打开第三个模式,一切都会再次发生。

每次调用modalEditProduct()时,都会为每个editBtns添加一个新的事件侦听器。

这意味着您第一次调用modalEditProduct()并单击按钮时,它会执行一次。 在第二次调用之后,按钮现在有两个单击事件侦听器,因此单击它们将执行两次,等等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM