【问题标题】:Hide field based on checkbox using javascript in odoo 12在odoo 12中使用javascript隐藏基于复选框的字段
【发布时间】:2020-05-22 02:13:46
【问题描述】:

我有两个字段,field1 是一个复选框,field2 是一个普通的文本字段。如果未选中 field1 并且如果

,我想隐藏 field2

field1 被选中,然后显示 field2。为此,我正在创建以下代码:


odoo.define('survey_inherit.FormView', function (require) {
"use strict";

var FormView = require('web.FormView');
var core = require('web.core');
var QWeb = core.qweb;

var FormView = FormView.extend({
   _checkField: function(){

        var $checkbox = $('.custom-control-input').val();

        if ($checkbox.is(':checked')) {

        $('.o_form_label').show();
        $('.mandatory_msg_class').show();
        }else{

          $('.mandatory_msg_class').hide();
        }//close else
   },
});//close FormController

return FormView; 
});

但是如果未选中 field1,则不会隐藏 field2,如果选中 field1,则不会显示 field2。

更新

我的要求是我有一个表单,其中包含一个带有小部件 many2many_tags 和其他字段的 one2many 字段。单击many2many_tags的标签后,我想在其他字段中显示完整的记录。单击标签后,我可以获得完整的记录,并且这些记录也可以放在其他字段中。使用 attrs 并打开表单视图来创建记录后,字段 2 将永远不会显示。但是在创建记录后以编辑模式打开表单视图并单击 many2many_tags 由于 attrs,未显示 field2。 删除 attrs 并打开用于创建记录字段的表单视图将显示(但不想显示,因为未选中 field1)并在创建记录后以编辑模式打开表单视图,单击 many2many_tags 可以正常工作。 attrs 条件:attrs="{'invisible':[('constr_mandatory','!=',True)]}" constr_ 强制:复选框字段
这就是我不使用 attrs 并试图在 javascript 的帮助下实现的原因。我希望所提供的信息能被理解。另外,我更新了问题,添加了屏幕截图以便更好地理解。

使用 attrs:

使用 attrs 点击 many2many_tags

不使用 attrs:

【问题讨论】:

    标签: javascript checkbox hide odoo


    【解决方案1】:

    var $checkbox = $('.custom-control-input').val();

    这一行将$checkbox 设置为复选框的值。可能你只想要复选框元素本身:

    var $checkbox = $('.custom-control-input');
    

    【讨论】:

    • 感谢@thanhdx 重播。但该字段未显示或隐藏。
    • @sss 它应该在 Odoo 中与在 JQuery 中一样工作。由于元素存在/查询/样式等,您可能会遇到其他错误。去调试并找到它。
    【解决方案2】:

    试试 jQuery

    $(function() {
      $("#selpoNO").click(function() {
        if ($(this).is(":checked")) {
          $(".if_pucEntry").show();
        } else {
          $(".if_pucEntry").hide();
        }
      });
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <!-- checkbox -->
    <label class="led-label"><input type="checkbox" class="led-btn" name="selpoNO" id="selpoNO" style="width: auto !important;"><strong>Checkbox</strong></label>
    
    <!-- text box -->
    
    <input type="text" class="form-control if_pucEntry" id="" name="" style="display: none;">

    【讨论】:

    • 感谢@Joe 重播。但该字段未显示或隐藏。我想在 odoo 12 中执行此操作。
    【解决方案3】:

    您可以添加一个新的小部件并覆盖click 方法。

    我使用BooleanToggle 字段进行此操作。

    var basic_fields = require('web.basic_fields');
    
    var Toggle = basic_fields.BooleanToggle.extend({
    
        _onClick: function (event) {
            var self = this;
            this._super(event);
            var node = event.view.$('.custom-control-input');
    
            if(this.value) {
                node.show();
            } else {
                node.hide();
            }
        },
    });
    
    fieldRegistry.add('toggle', Toggle);
    

    需要添加widget属性:

    field name="field1" widget="toggle"/>
    

    编辑
    您需要在表单加载后隐藏字段,我建议您覆盖FormRendererautofocus 函数。

    var FormRenderer = require('web.FormRenderer');
    FormRenderer.include({
        autofocus: function () {
            var self = this;
            // In my test I used fields values available in "self.state.data"
            if(self.state.model === 'sale.order' && field_value){
                var nodes = window.$('.custom-control-input');
                nodes.hide();
            }
            return this._super();
        },
    });
    

    【讨论】:

    • 谢谢@Kenly 的回答。您的答案在事件发生后正常工作,但在最初的切换关闭时,我想隐藏另一个字段。这是怎么做到的?你能建议吗?
    • 如果你需要根据另一个字段值隐藏一个字段,为什么不使用 attrs?
    • 我使用 attrs 效果很好。但在某些情况下,它不起作用。因此,我正在尝试使用 javascript 来实现。
    • 添加更多关于 attrs 不起作用的条件的详细信息,我们将弄清楚如何使它起作用
    • 您好@Kenly,抱歉回复晚了。我已经更新了我的问题。请检查 attrs 条件,因为评论部分只允许特定数量的字符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 2011-03-18
    • 1970-01-01
    • 2011-05-26
    相关资源
    最近更新 更多