window.aftersell.cart.events 下。
订阅是一个设置类调用,所以可以安全地放在脚本顶部,无需等待 ready()。
可用事件
订阅
events.on(event, handler) 注册一个处理函数并返回一个用于取消订阅的函数:
events.once(event, handler):触发一次后自行取消订阅。events.off(event, handler):移除特定的处理函数。
两条规则
不要在没有防护的情况下从 cart_updated 更改购物车
cart_updated 处理函数内部更改购物车会再次触发 cart_updated。如果那个处理函数又更改了购物车,你就有了一个无限循环。购物者会看着购物车反复抖动,而页面则疯狂请求 Shopify。
将载荷视为只读
registerLineTransform。
cart_loaded
cart_loaded 会向迟来的订阅者重放。**如果你在购物车已经加载后才订阅,你的处理函数会立即以当前购物车被调用。订阅顺序从不重要,所以你不必担心你的脚本是否抢在了购物车之前。
cart_updated
item_added
{ item },其中 item 是购物车行。
cart_loaded 到达。一次性添加多个不同产品会为每一行触发一次该事件。
item_removed
{ item },即该行消失前一刻的样子,所以你仍然可以读取它的 key、variantId 和 title。
item_added 有同样的注意事项:数量降低但未归零不算移除。
cart_opened 和 cart_closed
checkout
从 SDK 外部监听
CustomEvent 在 window 上派发,所以你可以在不接触 window.aftersell.cart 的情况下监听。这在主题文件、第三方应用或独立于购物车加载的脚本中很有用。
注意命名:总线使用
snake_case,DOM 事件在 aftersell:cart: 前缀后使用 kebab-case。
event.detail 到达,与购物车对象一致。事件在 window 上派发,所以页面上任何位置的监听器都能收到。购物车渲染在 shadow root 中,但 shadow 边界从不在事件的传播路径中。每次派发都会克隆载荷,所以修改 event.detail 的监听器不会影响其他任何人,抛出错误的监听器也不会干扰 SDK。
Shopify 标准购物车事件
document 上发布 Shopify 的标准购物车事件,这样主题代码和其他应用就可以像响应主题的变更一样响应 Aftersell 的变更:
每个事件还携带一个
promise,Aftersell 会在底层写入落定时将其 settle,符合 Shopify 的标准——await 它,不要去 resolve 它。这些事件在 document 上派发并会冒泡,所以 window 上的监听器也能收到。