我们将探讨如何在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秒钟,期间无法再次被点击,从而防止了函数的多次触发。
标签:function,函数,button,Odoo,disabled,点击,按钮,同一时间 From: https://blog.51cto.com/u_14480405/8924504