odoo js 修改函数时出错,属性 'include' undefined

odoo js error while modifying function, property 'include' undefined

修改了一个odoo网站的js函数。代码如下所示 -

odoo.define('website_custom_menu.menu_custom', function (require) {
    'use strict';
    require('website.contentMenu');
    var EditMenuDialog = require('website.contentMenu').EditMenuDialog;
    EditMenuDialog.include({
        start: function () {
            this._super();
            var r = this._super.apply(this, arguments);
            this.$('.oe_menu_editor').nestedSortable({
                listType: 'ul',
                handle: 'div',
                items: 'li',
                maxLevels: 4,
                toleranceElement: '> div',
                forcePlaceholderSize: true,
                opacity: 0.6,
                placeholder: 'oe_menu_placeholder',
                tolerance: 'pointer',
                attribute: 'data-menu-id',
                expression: '()(.+)'
            });
            return r;
        }
    });
});

这修改了网站菜单编辑器。可以编辑放置四级子菜单的地方。但这会在控制台上引发错误。

加载时显示 "Failed Module"。在控制台上进行一些调试后,我发现了以下错误:

TypeError: Cannot read property 'include' of undefined
    at website.assets_editor.js:191
    at process_job (web.assets_common.js:2994)
    at Object.process_jobs (web.assets_common.js:3000)
    at $.when.then.job.rejected (web.assets_common.js:2995)
    at web.assets_common.js:547
    at fire (web.assets_common.js:541)
    at Object.add as done
    at Array. (web.assets_common.js:547)
    at Function.each (web.assets_common.js:370)
    at Object. (web.assets_common.js:547)

我该如何解决这个问题,是什么原因造成的?我看过其他模块,他们也是这样做的。

TBN: 该模块依赖website模块,assets中添加了js文件。

您的代码有错误,请调用:

var EditMenuDialog = require('website.contentMenu').EditMenuDialog;

在odoo中跟随模块管理器,require会给出一个实例然后你可以extende/include试试:

var EditMenuDialog = require('website.contentMenu.EditMenuDialog');

如果 EditMenuDialog 是一个模块。

您可以查看我们的示例here

同样在 odoo 源代码上,您可以检查更多具有相同 hacks

的示例

examples

EditMenuDialog 未定义,因为 /website/static/src/js/website.contentMenu.js 定义了 website.contentMenu returns 只有顶部栏

return {
    'TopBar': TopBarContent,
};

可以添加EditMenuDialog:

return {
    'TopBar': TopBarContent,
    'EditMenuDialog': EditMenuDialog,
};

对于 EditMenuDialog,您应该使用扩展而不是包含。

提示:

odoo.define('website_custom_menu.menu_custom', function (require) {
'use strict';
    var widget = require('web_editor.widget');
    var MyMenuDialog = require('website.contentMenu');
    MyMenuDialog.EditMenuDialog.extend({
        start: function () {
            this._super();
            var r = this._super.apply(this, arguments);
            this.$('.oe_menu_editor').nestedSortable({
                listType: 'ul',
                handle: 'div',
                items: 'li',
                maxLevels: 4,
                toleranceElement: '> div',
                forcePlaceholderSize: true,
                opacity: 0.6,
                placeholder: 'oe_menu_placeholder',
                tolerance: 'pointer',
                attribute: 'data-menu-id',
                expression: '()(.+)'
            });
            return r;
        }
    });
    return MyMenuDialog;
});