使用 jQuery 操作 xml odoo 元素

Using jQuery to manipulate xml odoo elements

提问人:Hoda Shakourbin 提问时间:10/15/2022 最后编辑:KenlyHoda Shakourbin 更新时间:10/18/2022 访问量:475

问:

我在Odoo中制作了一些新模块,现在当每个表单加载时,我需要根据其所需的模型和任意更改来操作创建的XML元素,或者引用某些特定函数进行数据验证(我知道还有其他方法可以进行数据验证,但我很好奇是否可以使用jquery函数来完成)。

首先,我尝试在视图文件夹中添加一个 HTML 文件并编写一个简单的脚本,但我不确定它是否是正确的位置,甚至是正确的代码段。

<script>
    $(document).ready(function()
    {  
        $("input").keyup(function(event){
            console.log('t');
        });
    });
</script>

如果有人能为我的问题提供一些有用的答案,我将很高兴。

javascript html jquery xml odoo

评论


答:

-1赞 Said Gourida 10/15/2022 #1

如果你想使用jQuery或任何JS库,你需要把它们放在这个文件中,路径是:/your_app/static/src/js/test.js 文件应该是这样的:

$(document).ready(function()
{  
    $("input").keyup(function(event){
        console.log('t');
    });
});

你需要像这样为这项工作添加资产:

'assets': {'web.assets_qweb': ['/your_app/static/src/js/test.js']} #path of the file

这是为了jQuery,而不是在odoo中构建JS模型

评论

0赞 Hoda Shakourbin 10/15/2022
是的,我已经尝试过这段代码,但它适用于整个模块,就像我说的,我正在寻找一种方法将这些更改或事件中的每一个绑定到特定的模型甚至视图。这就是为什么我认为也许剧本会更适合,但似乎这不是正确的方式,对吧?
0赞 Said Gourida 10/17/2022
是的,所以你需要建立JS模型
1赞 sylvain 10/16/2022 #2

对于后台 javascript,可以考虑使用“Odoo 内置 js 库”:

在自定义模块“my_custom_module”中: 创建一个新文件 /my_custom_module/static/src/js/my_customization.js:

    odoo.define('my_custom_module.switch_to_gantt', function(require) {
        "use strict";
    
    var core = require('web.core');
    var _t = core._t;
    var AbstractController = require('web.AbstractController');
    
    AbstractController.include({
    
        /**
         * Original : Intercepts the 'switch_view' event to add the controllerID into the data, and lets the event bubble up.
         * Included : On switching from Kanban to Gantt view : Remove all the GroupBy Filters because it caused Error
         */
       _onSwitchView: function (ev) {
       console.log(ev.data.view_type);
            //debugger;
/* only on the specific view : gantt: */
            if(ev.data.view_type == 'gantt')
            {
/* only on the specific model : event.event: */
            if(ev.target.modelName == 'event.event')
                $('.o_searchview .o_facet_remove').click();
            }
            this._super.apply(this, arguments);
    
         },
    });
    });

并在文件中声明此资产:__manifest__.py

'assets': {'web.assets_qweb': ['/my_custom_module/static/src/js/my_customization.js']}

评论

0赞 Hoda Shakourbin 10/17/2022
非常感谢您的回答。虽然它没有达到我的确切目的,但它有助于掌握我应该遵循的过程。
1赞 Kenly 10/16/2022 #3

您可以使用该属性自定义现有表单视图,其值将是扩展表单视图的名称。js_class

若要将新事件绑定到输入,可以自定义表单控制器并扩展映射。events

例:

1) 扩展表单视图:

odoo.define("MODULE_NAME.custom_form", function (require) {
    "use strict";

    var FormController = require('web.FormController');
    var FormView = require('web.FormView');
    var viewRegistry = require('web.view_registry');

    var CustomController = FormController.extend({

        events: _.extend({}, FormController.prototype.events, {
            'keyup input': '_onInputKeyup',
        }),

        _onInputKeyup(ev) {
            console.log('t');
        },

    });

    var CustomFormView = FormView.extend({
        config: _.extend({}, FormView.prototype.config, {
            Controller: CustomController,
        }),
    });

    viewRegistry.add('custom_form', CustomFormView);

    return {
        CustomController: CustomController,
        CustomFormView: CustomFormView,
    };

});

2) 将其添加到清单文件中的资产条目中

'assets': {
    'web.assets_backend': [
        'MODULE_NAME/static/src/js/custom_form_view.js'
    ],
},

3) 在表单视图标签上设置 js_class 属性

<form js_class="custom_form">

评论

0赞 Hoda Shakourbin 10/17/2022
非常感谢你,这是一个有趣的解决方案,也许它会涵盖我的一些目标。我一定会尝试的。