Odoo中防止用户同一时间多次点击同一按钮触发函数
  P2ITagOceBds 2023年12月22日 70 0

我们将探讨如何在Odoo中实现一个全局防重复点击功能,以防止用户在短时间内重复点击按钮而触发多次函数调用。这种情况通常发生在用户不断快速点击同一个按钮时,导致后端函数被多次调用,可能会引起数据错误或性能问题。

在Odoo中,我们可以通过自定义模块来实现这个功能。

首先,我们需要在button_click.js文件中定义我们的防重复点击函数,如下所示:

odoo.define('global_debounce.ButtonClick', function (require) {
    "use strict";

    $(document).ready(function() {

        function debounceButtonClicked(event) {
            var $button = $(event.currentTarget);
            if (!$button.is(':disabled')) {
                // 禁用按钮
                $button.prop('disabled', true);
                console.log("Button disabled:", $button.is(':disabled'));
                // 延时重新启用按钮
                //setTimeout(function () {
                  //  console.log('Button is re-enabled');
                    $button.prop('disabled', false);
                //}, 3000); // 设置防重复点击时间,例如3秒
            }
        }

        // 绑定全局点击事件
        $(document).on('click', 'button', debounceButtonClicked);
    });
});

在上面的代码中,我们定义了一个名为debounceButtonClicked的函数,该函数会在按钮点击事件发生时被调用。当按钮被点击时,我们首先检查按钮是否已被禁用。如果没有,我们将其禁用,并设置一个3秒的延时,之后再次启用按钮。

接下来,我们需要在asset.xml文件中引入这个JavaScript文件,以便它能够在Odoo中被加载:

<odoo>
    <data>
        <template id="assets_backend" name="global_debounce assets" inherit_id="web.assets_backend">
            <xpath expr="." position="inside">
                <script type="text/javascript" src="/your_module_name/static/src/js/button_click.js"/>
            </xpath>
        </template>
    </data>
</odoo>

请确保将/your_module_name/替换为您的模块的实际路径。

最后,我们需要创建一个自定义按钮,并将其绑定到一个函数,该函数将模拟一个3秒的休眠过程。在Odoo的视图XML中,我们可以这样定义按钮:

<odoo>
    <data>
        <!-- Your form view extension -->
        <record id="your_module.form_view_extension" model="ir.ui.view">
            <field name="name">your.model.form.inherit</field>
            <field name="model">your.model</field>
            <field name="inherit_id" ref="base.view_your_model_form"/>
            <field name="arch" type="xml">
                <xpath expr="//form/sheet" position="inside">
                    <button string="Sleep 3 Seconds" type="object" name="button_sleep_function"/>
                </xpath>
            </field>
        </record>
    </data>
</odoo>

在您的模型中,您需要定义button_sleep_function函数,如下所示:

from odoo import models, api
import time

class YourModel(models.Model):
    _name = 'your.model'

    @api.multi
    def button_sleep_function(self):
        time.sleep(3)  # 模拟耗时操作,休眠3秒
        return True

现在,当用户点击这个按钮时,它将被禁用3秒钟,期间无法再次被点击,从而防止了函数的多次触发。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月22日 0

暂无评论

推荐阅读
  anLrwkgbyYZS   2023年12月30日   33   0   0 ideciciMaxideMax
P2ITagOceBds