You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odoo POS界面中如何捕获产品列表变更事件?

Odoo POS 产品网格变更事件捕获实现

要捕获POS界面产品网格的变更事件,你可以通过以下两种方式实现,适配Odoo基于OWL框架的POS组件逻辑:

方法一:使用OWL的useEffect监听产品列表变化

通过监听ProductScreen组件的products属性变更,只要产品列表因搜索、分类切换、库存更新等任何原因发生变化,都会触发自定义逻辑:

/** @odoo-module **/
const ProductScreen = require('point_of_sale.ProductScreen');
const Registries = require('point_of_sale.Registries');
const { Gui } = require('point_of_sale.Gui');
const { useEffect } = require('@odoo/owl');

export const ChangePOSGrid = (ProductScreen) =>
  class extends ProductScreen {
       setup() {
           super.setup();
           // 监听products属性变化,触发自定义处理方法
           useEffect(() => {
               this._handleProductGridChange();
           }, () => [this.props.products]);
       }

       // 自定义产品网格变更处理逻辑
       _handleProductGridChange() {
           console.log('产品网格已更新,当前产品数量:', this.props.products.length);
           // 在这里执行你的业务操作
       }

       //@override
        async _onClickPay() {
           console.log('支付按钮点击');
           await super._onClickPay(); // 必须调用父类方法,保留原支付功能
        }
}
Registries.Component.extend(ProductScreen, ChangePOSGrid);

方法二:重写_updateProducts方法

ProductScreen中的_updateProducts是负责更新产品列表的核心方法,所有主动触发的产品网格变更(如搜索、分类切换、分页)都会调用它,重写该方法可以精准捕获这类场景:

/** @odoo-module **/
const ProductScreen = require('point_of_sale.ProductScreen');
const Registries = require('point_of_sale.Registries');
const { Gui } = require('point_of_sale.Gui');

export const ChangePOSGrid = (ProductScreen) =>
  class extends ProductScreen {
       //@override
       async _updateProducts() {
           await super._updateProducts(); // 先执行父类的产品更新逻辑
           // 产品网格完成更新,执行自定义操作
           console.log('产品网格已变更,当前产品列表:', this.props.products);
       }

       //@override
        async _onClickPay() {
           console.log('支付按钮点击');
           await super._onClickPay();
        }
}
Registries.Component.extend(ProductScreen, ChangePOSGrid);

注意事项

  • 重写父类方法时必须调用super对应的方法,否则会破坏POS原有功能(比如支付按钮的核心逻辑)。
  • 若需要捕获所有可能的产品列表变更(包括后台数据同步导致的产品更新),优先选择useEffect的方式;若只关注用户操作触发的网格变更,使用重写_updateProducts的方式更高效。

内容的提问来源于stack exchange,提问作者ahmed mohamady

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 09:43:27