Проблема
Когда у корзины не задан 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 добавление товара корзину обновляет, а изменение количества — нет. Поведение двух модулей на одинаковом входе разное.
Что предлагается
- При двух и более совпадениях писать в консоль, что перерисовка пропущена и нужен
selector. Молчаливый отказ превращается в диагностируемый — это главное.
- Выровнять
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.
Проблема
Когда у корзины не задан
selector,CartUIищет приёмник по списку запасных селекторов — но подставляет HTML только если нашёлся ровно один элемент:Два совпадения — и
elementостаётсяnull. HTML с сервера пришёл, но никуда не записан. Ни сообщения, ни записи в консоль: корзина просто перестаёт обновляться.Кому это достаётся
Две корзины на странице без
selector. Основная корзина и мини-корзина в шапке, обе на классе.msCart— типовая вёрстка. Совпадений два, не обновляется ни одна.Это прямо задевает возможность, которую мы сами рекламируем: «любое количество корзин на одной странице». Она работает, но только если про
selectorзнать — а узнать о нём неоткуда, см. соседний issue про свойства сниппета.Свой чанк с корневым элементом из списка. Если корневой
<div>чанка сам имеетclass="msCart"илиdata-ms-cart, то после первой перерисовки внутри приёмника появляется второй такой же элемент. Дальше совпадений два, обновления прекращаются со второго клика. Штатные чанкиms3_cart.tplиms3_minicart.tplтакого корня не имеют — на этот путь попадает только тот, кто верстал чанк сам.Почему нельзя просто убрать проверку
Она стоит осознанно — комментарий в коде объясняет: без неё HTML одной корзины запишется внутрь другой. Проблема не в проверке, а в том, что её срабатывание ничем не обозначено.
Дополнительно: у QuantityUI запасного списка нет вовсе
Кнопки +/− без
selectorне перерисовывают корзину никогда, даже когда приёмник на странице один. То есть безselectorдобавление товара корзину обновляет, а изменение количества — нет. Поведение двух модулей на одинаковом входе разное.Что предлагается
selector. Молчаливый отказ превращается в диагностируемый — это главное.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.