Skip to content

[Frontend] Корзина молча перестаёт обновляться, если на странице два приёмника без selector #804

Description

@biz87

Проблема

Когда у корзины не задан selector, CartUI ищет приёмник по списку запасных селекторов — но подставляет HTML только если нашёлся ровно один элемент:

// assets/components/minishop3/js/web/ui/CartUI.js:352-377
const fallbackSelectors = [
  '#ms3oc-cart-live',
  '#msb-test-cart',
  '#msCart',
  '[data-ms-cart]',
  '.msCart',
]
...
// Avoid writing one cart HTML into another when several roots exist.
if (found.length === 1) {
  element = found[0]
}

Два совпадения — и element остаётся null. HTML с сервера пришёл, но никуда не записан. Ни сообщения, ни записи в консоль: корзина просто перестаёт обновляться.

Кому это достаётся

Две корзины на странице без selector. Основная корзина и мини-корзина в шапке, обе на классе .msCart — типовая вёрстка. Совпадений два, не обновляется ни одна.

Это прямо задевает возможность, которую мы сами рекламируем: «любое количество корзин на одной странице». Она работает, но только если про selector знать — а узнать о нём неоткуда, см. соседний issue про свойства сниппета.

Свой чанк с корневым элементом из списка. Если корневой <div> чанка сам имеет class="msCart" или data-ms-cart, то после первой перерисовки внутри приёмника появляется второй такой же элемент. Дальше совпадений два, обновления прекращаются со второго клика. Штатные чанки ms3_cart.tpl и ms3_minicart.tpl такого корня не имеют — на этот путь попадает только тот, кто верстал чанк сам.

Почему нельзя просто убрать проверку

Она стоит осознанно — комментарий в коде объясняет: без неё HTML одной корзины запишется внутрь другой. Проблема не в проверке, а в том, что её срабатывание ничем не обозначено.

Дополнительно: у QuantityUI запасного списка нет вовсе

// assets/components/minishop3/js/web/ui/QuantityUI.js:231-235
if (!config || !config.selector) {
  continue
}

Кнопки +/− без selector не перерисовывают корзину никогда, даже когда приёмник на странице один. То есть без selector добавление товара корзину обновляет, а изменение количества — нет. Поведение двух модулей на одинаковом входе разное.

Что предлагается

  1. При двух и более совпадениях писать в консоль, что перерисовка пропущена и нужен selector. Молчаливый отказ превращается в диагностируемый — это главное.
  2. Выровнять QuantityUI с CartUI: либо дать ему тот же запасной список, либо убрать список из CartUI и требовать selector везде одинаково.

Второй пункт — вопрос к архитектуре, первый нужен в любом случае.

Затрагиваемые файлы

  • assets/components/minishop3/js/web/ui/CartUI.js:352-377 — запасные селекторы и правило одного совпадения
  • assets/components/minishop3/js/web/ui/QuantityUI.js:231-235 — запасного списка нет

Найдено при сверке документации с кодом для страниц snippets/mscart и frontend/cart.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingjavascriptPull requests that update javascript code

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions