Элемент обновления LocalStorage вызывает дублирование с JSON в JQuery - PullRequest
5 голосов
/ 07 марта 2020

Поэтому я пытаюсь обновить элемент в LocalStorage с помощью JSON, но я не могу понять, что я делаю так неправильно. Я хочу добавить товар и позволить обновлять его количество при добавлении того же товара снова.

При первом добавлении продукта X я получаю правильное количество в одном элементе. После добавления еще одного X количество изменится на ноль. Добавление совершенно нового продукта Y приведет к появлению нескольких повторяющихся элементов Y со всеми нулевыми количествами.

Должна быть логическая ошибка, которую я просто не могу понять. Функция addToCart - это то, где я подозреваю, что что-то идет не так. Любая помощь очень ценится, поскольку я новичок в JavaScript и JQuery. Спасибо.

$(document).ready(function() {
  // caching
  let $table = $(".shoe-table");

  fetch("shoes.json")
    .then(resp => resp.json())
    .then(data => {
      let shoes = data.shoes;
      let rows = [1, 2, 3];
      let shoeCard = "";
      let products = JSON.parse(localStorage.products || "[]");
      console.log(products);

      function addToCart(cBtn) {
        let clickedButton = $(cBtn);
        let buttonID = clickedButton.attr("id");
        let thisInput = $("#" + clickedButton.attr("id") + ".input-form").children("input");
        let newShoe = {
          id: buttonID,
          image: shoes[buttonID].image,
          name: shoes[buttonID].name,
          price: shoes[buttonID].price,
          quantity: parseInt(thisInput.val())
        };

        if (products.length != 0) {
          products.forEach(shoe => {
            if (shoe.name == newShoe.name) {
              shoe.quantity += newShoe.quantity;
              localStorage.setItem("products", JSON.stringify(products));
              console.log(products);
            } else {
              products.push(newShoe);
              localStorage.setItem("products", JSON.stringify(products));
            }
          });
        } else {
          products.push(newShoe);
          localStorage.setItem("products", JSON.stringify(products));
        }
      }

      let counter = 0;
      rows.forEach(row => {
        shoeCard += "<tr>";
        for (let index = 0; index < 4; index++) {
          shoeCard +=
            "<td class='card text-center'>" +
            "<img class='card-img-top' src=" +
            shoes[counter].image +
            " alt='Card image cap'>" +
            "<h5 class='card-title'>" +
            shoes[counter].name +
            "</h5>" +
            "<p class='card-text'>kr " +
            shoes[counter].price +
            "</p>" +
            "<button id=" +
            counter +
            " class='orderNow btn btn-outline-dark'>ORDER NOW</button>" +
            "<div id=" +
            counter +
            " class='input-form'><input class='qty-chooser' type='number' placeholder='Choose quantity' min=0 max=10>" +
            "<button class='btn-add-to-cart' disabled='disabled'>ADD TO CART</button>" +
            "</div>" +
            "</td>";
          counter++;
        }

        shoeCard += "</tr>";
      });

      $table.append(shoeCard);
      let $inputForm = $(".input-form");
      let $orderBtn = $(".orderNow");

      $inputForm.hide();

      let activeButton = -1;

      // Denna metod tittar om man redan har en aktiv beställning
      function isProductActive() {
        let btnID = $(this).attr("id");
        if (activeButton == -1) {
          activeButton = btnID;
          toggleOrder($(this));
        } else if (btnID != activeButton) {
          toggleOrder($("#" + activeButton + ".orderNow"));
          toggleOrder($(this));
          activeButton = btnID;
        } else if (btnID == activeButton) {
          toggleOrder($(this));
          activeButton = -1;
        }
      }

      $orderBtn.click(isProductActive);

      function toggleOrder(buttonC) {
        console.log("INSIDE TOGGLE");
        let clickedBtn = $(buttonC);
        let thisInputForm = $("#" + clickedBtn.attr("id") + ".input-form");

        let inputBtn = thisInputForm.children("button");
        let inputIn = thisInputForm.children("input");

        // RESETTAR ELEMENT I .input-form
        function resetInputForm() {
          inputBtn.css("background", "");
          inputBtn.css("color", "");
          inputBtn.attr("disabled", "disabled");
          inputIn.val(null);
        }

        // DENNA KNAPP ÄR EN ADD TO CART FUNKTION
        inputBtn.click(function() {
          // TODO: LÄGG TILL LOGIK FÖR ATT LÄGGA TILL VARUKORG
          console.log("INSIDE ADDING");

          addToCart(clickedBtn);
          thisInputForm.hide("slow");
          clickedBtn.text("ORDER NOW");
          clickedBtn.css("background", "");
          resetInputForm();
          activeButton = -1;
        });
        // BEROENDE PÅ QUANTITY REAGERAR ADD TO CART KNAPPEN
        inputIn.change(function() {
          let qty = inputIn.val();

          if (qty >= 1 && qty <= 10) {
            inputBtn.removeAttr("disabled");
            inputBtn.css("background", "rgb(15, 163, 10)");
            inputBtn.css("color", "white");
          } else if (qty < 1) {
            resetInputForm();
          } else if (qty > 10) {
            inputIn.val(10);
          }
        });

        // KONTROLLERAR ORDER NOW KNAPPEN
        if (clickedBtn.text() == "CANCEL") {
          thisInputForm.hide("slow");
          clickedBtn.text("ORDER NOW");
          clickedBtn.css("background", "");
          resetInputForm();
        } else {
          thisInputForm.show("slow");
          clickedBtn.text("CANCEL");
          clickedBtn.css("background", "red");
          inputBtn.attr("disabled", "disabled");
          resetInputForm();
        }
      }
    })
    .catch(err => console.error(err));
});

Ответы [ 2 ]

5 голосов
/ 07 марта 2020

Измените код localStorage следующим образом. Проблема в том, что вы перемещаете все продукты на каждой итерации forEach в localStorage.

Попробуйте следующий код.

if (products.length != 0) {
  let isExists = products.some(shoe => shoe.name === newShoe.name);
  if (!isExists) {
    products.push(newShoe);
  } else {
      products = products.map(shoe => {
      if (shoe.name == newShoe.name && !isNaN(newShoe.quantity)) {
        shoe.quantity += newShoe.quantity;
        return shoe;
      }
      return shoe;
    });
  }
  localStorage.setItem("products", JSON.stringify(products));
} else {
  products.push(newShoe);
  localStorage.setItem("products", JSON.stringify(products));
}

1 голос
/ 07 марта 2020
    if (products.length != 0) {
      for (let index = 0; index < products.length; index++) {
        if (products[index].name == newShoe.name) {
          products[index].quantity += newShoe.quantity;
          localStorage.setItem("products", JSON.stringify(products));    
          break;
        } else{
          products.push(newShoe);
          localStorage.setItem("products", JSON.stringify(products));  
          break;
        }
      }
    } else {
      products.push(newShoe);
      localStorage.setItem("products", JSON.stringify(products));
    }

Это решает проблему с дубликатами, но все еще имеет проблемы с нулевыми количествами при добавлении существующего продукта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...