【问题标题】:Odoo Override Javascript Class MethodOdoo 覆盖 Javascript 类方法
【发布时间】:2021-07-09 18:44:17
【问题描述】:

首先,我深表歉意 - 我是 javascript 的新手,所以这有点超出我的想象。我对 Odoo 也很陌生,到目前为止,我大部分时间都坚持使用 python 和 XML 自定义。

我正在尝试覆盖一个类中的 javascript 方法,以用我自己的版本完全替换它。从 Odoo 文档 (https://www.odoo.com/documentation/14.0/reference/javascript_reference.html#patching-an-existing-class) 来看,这应该是使用 .include() 方法用我的新方法修补原始类的简单问题。但是当我这样做时,我得到一个错误Error while loading mymodule.CustomControlPanelModelExtension: TypeError: ControlPanelModelExtension.include is not a function

我试图覆盖的原始 Odoo 代码:

odoo.define("web/static/src/js/control_panel/control_panel_model_extension.js", function (require) {
  "use strict";
    
  // a bunch of code here ...

  class ControlPanelModelExtension extends ActionModel.Extension {
    // more code here ...

    // this is the method I'm trying to override
    _getAutoCompletionFilterDomain(filter, filterQueryElements) {
      // original method body here
    }

    // more code
  }

  // more code
});

以下是我根据文档提出的,但这给了我错误Error while loading mymodule.CustomControlPanelModelExtension: TypeError: ControlPanelModelExtension.include is not a function(此错误在浏览器开发工具控制台中报告)。

odoo.define('mymodule.CustomControlPanelModelExtension', function(require) {
  "use strict";

  var ControlPanelModelExtension = require('web/static/src/js/control_panel/control_panel_model_extension.js');

  ControlPanelModelExtension.include({

    // override _getAutoCompletionFilterDomain 
    _getAutoCompletionFilterDomain: function(filter, filterQueryElements) {
      // my custom implementation here
    },

  });
});

任何想法我在这里做错了什么?我已经尝试过使用扩展等各种其他方法,但我认为我不想扩展 - 这不会替换现有实例中的函数。

【问题讨论】:

    标签: javascript odoo odoo-14


    【解决方案1】:

    这里的问题是 include 函数仅适用于从 OdooClass 继承的类,在这种情况下,您尝试继承的类是原生 JavaScript 类。


    那么,要给类添加属性或方法,就必须修改对象类的原型属性。

    odoo.define('mymodule.CustomControlPanelModelExtension', function(require) {
        "use strict";
    
        const ControlPanelModelExtension = require('web/static/src/js/control_panel/control_panel_model_extension.js');
    
        function _getAutoCompletionFilterDomain(filter, filterQueryElements) {
            // your custom implementation here
        }
    
        ControlPanelModelExtension.prototype._getAutoCompletionFilterDomain = _getAutoCompletionFilterDomain;
    
        return ControlPanelModelExtension;
    });
    

    【讨论】:

    • 太棒了,效果很好!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    相关资源
    最近更新 更多