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

时间:2017-07-31 06:29:09

标签: javascript backbone.js odoo-10

我修改了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;
        }
    });
});

这会修改网站菜单编辑器。在哪里可以编辑以放置四个级别的子菜单。但是这会给妓女带来错误。

加载时说“失败的模块”。在控制台上进行一些调试后,我发现以下错误:

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:模块将网站模块作为依赖项,并将js文件添加到资产中。

3 个答案:

答案 0 :(得分:2)

EditMenuDialog未定义,因为 /website/static/src/js/website.contentMenu.js 定义 website.contentMenu 仅返回TopBar

return {
    'TopBar': TopBarContent,
};

您可以向其添加EditMenuDialog:

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

答案 1 :(得分:0)

您的代码有错误,请拨打电话:

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

在odoo中的模块管理器之后,require会给出一个实例然后你可以扩展/包含try:

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

如果EditMenuDialog是模块。

您可以查看我们的示例here

另外,在odoo源代码中,您可以查看具有相同hacks

的更多示例

examples

答案 2 :(得分:0)

您应该使用extend而不是Edit for 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;
});