James Min Ответов: 1

Добавить корзину не работает в ES6 (java script)


Привет, ребята, у меня проблема. Функция добавить в корзину работает неправильно. После того как я нажал кнопку Добавить в корзину, если это тот же идентификатор продукта, он выводит новый продукт в другую строку. Еще одна проблема - это общая сумма в таблице корзины.

Что я уже пробовал:

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

<!DOCTYPE html>
<html>
<head>
  <title>Shopping Cart ES6</title>
</head>
<body>
  <form name="order" id="order">
    <table>
      <tr>
        <td>
          <label for="productID">Product ID:</label>
        </td>
        <td>
          <input id="productID" name="product" type="text" size="28" required/>
        </td>
      </tr>
      <tr>
          <td>
              <label for="product">Product Desc:</label>
          </td>
          <td>
              <input id="product_desc" name="product" type="text" size="28" required/>
          </td>
      </tr>
      <tr>
          <td>
              <label for="quantity">Quantity:</label>
          </td>
          <td>
              <input id="quantity" name="quantity" width="196px" required/>
          </td>
      </tr>
      <tr>
          <td>
              <label for="price">Price:</label>
          </td>
          <td>
              <input id="price" name="price" size="28" required/>
          </td>
      </tr>
  </table>
  <input type="reset" class="resetbtn" value="Reset" />
  <input type="button" id="btnAddProduct" onclick="addProduct();" value="Add New Product" >
</form>
<table border="1|1" id="products-table">
  <tr>
    <th>Product ID</th>
    <th>Product Description</th>
    <th>Quantity</th>
    <th>Price</th>
    <th>Action</th>
  </tr>
</table>
<br />
<h2>Shopping Cart</h2>
<table border="1|1" id="carts-table">
  <tr>
    <th>Product ID</th>
    <th>Product Description</th>
    <th>Quantity</th>
    <th>Price</th>
    <th>Total Amount</th>
    <th>Action</th>
  </tr>
</table>
</body>
<script src="script.js">
</script>
</html>
 
<script>
//JS File

const products = [];
const carts = [];
const inputs = {
  id: document.getElementById("productID"),
  desc: document.getElementById("product_desc"),
  qty: document.getElementById("quantity"),
  price: document.getElementById("price")
};
const productsTable = document.getElementById("products-table");
const cartsTable = document.getElementById("carts-table");

function renderProductsTable() {
  // delete all entries
  Array.from(productsTable.children).slice(1).forEach(entry =&gt; productsTable.removeChild(entry));
    
    for (product of products) {
      const tr = document.createElement('tr');
      const id = document.createElement('td');
      id.textContent = product.id;
      const desc = document.createElement('td');
      desc.textContent = product.desc;
      const qty = document.createElement('td');
      qty.textContent = product.qty;
      const price = document.createElement('td');
      price.textContent = product.price;
      const action = document.createElement('td');
      const deleteButton = document.createElement('button');
      deleteButton.textContent = 'Delete';
      deleteButton.addEventListener('click', () =&gt; removeProduct(product.id))
      const addToCartButton = document.createElement('button');
      addToCartButton.textContent = 'Add to cart';
      addToCartButton.addEventListener('click', () =&gt; addCart(product.id));
      action.appendChild(deleteButton);
      action.appendChild(addToCartButton);
      tr.appendChild(id);
      tr.appendChild(desc);
      tr.appendChild(qty);
      tr.appendChild(price);
      tr.appendChild(action);
      productsTable.appendChild(tr);
      console.log(products); 
    }

}

function addProduct() {
  
  const product = {
  id: inputs.id.value,
  desc: inputs.desc.value, 
  qty: Number(inputs.qty.value),
  price: Number(inputs.price.value)
  };

  let existing = products.find(item =&gt; item.id === product.id);

  if (existing) {
  existing.qty += product.qty;
  } 
  else {
   products.push(product);
  }
  renderProductsTable();
  document.getElementById('order').reset();
  }



function removeProduct(product_id) {
  const index = products.findIndex(p =&gt; p.id === product_id);
  products.splice(index, 1);
  renderProductsTable();
}

function addCart(product_id) {
      const product = products.find(p =&gt; p.id === product_id);
      const cartItem = carts.find(c =&gt; c.product === product);
      if(cartItem) {
        cartItem.qty += 1;
      }
      else {
        carts.push(product);
      }
      renderCartTable();
            console.log(cartItem);
}

function renderCartTable() {
  for (cart of carts){
    const tr = document.createElement('tr');
    const id = document.createElement('td');
    id.textContent = cart.id;
    const desc = document.createElement('td');
    desc.textContent = cart.desc;
    const qty = document.createElement('td');
    qty.textContent = cart.qty;
    const price = document.createElement('td');
    price.textContent = cart.price;
    const total = document.createElement('td');
    total.textContent = "Total Amount Should Calculate Here Automatically"
    const action = document.createElement('td');
    const subtractButton = document.createElement('button');
    subtractButton.textContent = 'Subtract Quantity';
    const addButton = document.createElement('button');
    addButton.textContent = 'Add Quantity';
    const removeButton = document.createElement('button');
    removeButton.textContent = 'Remove Item';
    tr.appendChild(id);
    tr.appendChild(desc);
    tr.appendChild(qty);
    tr.appendChild(price);
    tr.appendChild(total);
    tr.appendChild(action);
    cartsTable.appendChild(tr);
    console.log(carts);
  }
}
</script>

1 Ответов

Рейтинг:
1

Andy Lanng

Вот он в jsfiddle:
Добавить корзину не работает - JSFiddle[^]

Но это работает, как и ожидалось.

Я сделал пару изменений только для того, чтобы заставить его работать, например, заполнив элементы на doc.ready, просто чтобы он соответствовал jsfiddle.

Я также сделал функции стрелками функций.

Наверное, я не понимаю, когда вы загружаете сценарий? Может быть, к моменту запуска документ еще не закончил загрузку всех элементов?

Попробуйте посмотреть на jQuery. Он отлично работает с ES6. Вместо того, чтобы искать элемент, вы можете установить селекторы, которые действуют как указатели на соответствующие элементы. Это гораздо более последовательный способ овладеть своими элементами. Вот, смотри:

let id = document.getElementById("productID")
//id will be null if the element hasn't loaded yet
id = $("productID")
//this will be evaluated when it's called.  It will return an array btw


James Min

@Andy Lanng. Мы были проинструктированы, используя только простой javascript. Это все равно не работает. Когда мы добавляем тот же продукт с тем же идентификатором, он все равно выводит новую строку.

Andy Lanng

Какой браузер вы используете? JsFiddle отлично работает в Chrome и Firefox. Совсем не в IE. Это может дать нам ключ к разгадке.

Andy Lanng

Кроме того, почему ваша ссылка на скрипт находится в таком странном месте? вы пробовали переместить его в document.addEventListener("DOMContentLoaded",function(){...});? это может решить все ваши проблемы

James Min

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

Andy Lanng

Посмотрите на мой jsFiddle. Я взял ваш код и не могу заставить его создать две строки с одним и тем же идентификатором. Должно быть что-то еще происходит за пределами того, что вы мне показали

James Min

Да. Я играл на вашем jsFiddle. да, его добавление в корзину, но я прошу помощи, так как хочу, чтобы если тот же идентификатор продукта будет добавлен в корзину, он не должен добавлять новую строку, а просто обновит количество продуктов

Andy Lanng

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

Какой браузер вы используете (имя и версия)?
У вас есть еще какие-нибудь запущенные скрипты?
Из какой среды вы работаете (IIS, Appache, просто открываете html-файл в браузере)?

Я не могу помочь, пока не смогу воссоздать проблему!

James Min

Например, если я добавлю в корзину продукт с тем же идентификатором продукта, он просто обновит количество, а не добавит новую строку. Вы его получили?

Andy Lanng

Подождите-может быть, мы перекрещиваем наши провода:
Существуют ли два разных продукта с одним и тем же идентификатором? тогда как же вам определить, что они разные. Я думал, что такое поведение было желательным. Если я все еще ошибаюсь, пожалуйста, дайте мне знать

James Min

Я играл на твоей скрипке. Влияет ли на это браузер? Это скрипка, которую я щелкнул https://jsfiddle.net/dhkufkq9/5/

Andy Lanng

Да, браузер действительно имеет значение. Я думаю, что это порядок загрузки при построении dom. Мой JSFiddle не работает в моей версии IE

James Min

Давайте переключимся на эту проблему. Я сделал это более чистым ES6. Проблема еще и в корзине. Взгляните на это, пожалуйста. https://www.codeproject.com/Questions/1196346/Problem-in-shopping-cart-in-javascript-ES