Невозможно получить правильное целевое значение в приложении Ruby on Rails

#javascript #ruby-on-rails #stimulusjs

#javascript #ruby-on-rails #stimulusjs

Вопрос:

Я создаю простое приложение для корзины покупок и использую Stimulum JS для обработки взаимодействия между представлениями Rails и логикой Javascript.

На странице корзины я отображаю товар, просматривая их в пользовательском интерфейсе как:

 
<% @curr_cart.items.each do |item| %>

     <span id="test" data-target="cart.count">

        <%= item.quantity %>

     </span>

 

Я пытаюсь добавить функцию «удалить», которая удаляет товары из корзины. Моя логика удаления работает нормально, но я не могу обновить количество нужного элемента. Каждый раз, когда я удаляю продукт, уменьшается только количество первого элемента.

Вот как я обновляю:

this.countTarget.innerHTML = Number(this.countTarget.innerHTML)- 1;

Пробовал использовать значения и атрибуты данных, но безуспешно: нахмурился:

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

Спасибо!

Ответ №1:

Из опубликованного вами кода и описания я полагаю, что вы используете один экземпляр контроллера стимула для всех товаров корзины. Что-то вроде этого:

 <div data-controller="cart-items">
  <% @curr_cart.items.each do |item| %>
    <span id="test" data-target="cart.count">
      <%= item.quantity %>
    </span>
    ...
    other fields
    ...
  <% end %>
</div>
 

У этого подхода есть одна проблема: вам нужно выяснить, какой элемент вы пытаетесь отредактировать, и изменить правильные поля. Насколько я понимаю, элементы не должны зависеть друг от друга. Я бы посоветовал вам использовать один экземпляр контроллера стимула на строку:

 <% @curr_cart.items.each do |item| %>
  <div data-controller="cart-item">
    <span id="test" data-target="cart.count">
      <%= item.quantity %>
    </span>
    ...
    other fields
    ...
  </div>
<% end %>
 

Теперь каждая строка привязана к самой себе в контроллере JS, вам не нужно искать конкретную строку в countTargets массиве, у вас есть только одна countTarget в каждой строке. Это должно решить вашу проблему. Недостатком является то, что строки не могут взаимодействовать друг с другом, но вы можете добиться этого с помощью другого контроллера стимулов, если вам это нужно.

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

1. Спасибо! Это то, что я в итоге сделал. Однако хотелось бы знать, есть ли какие-либо проблемы с наличием / созданием нескольких экземпляров контроллера (например, если это делалось для большого списка элементов)?

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