Скрыть поле на основе флажка, используя javascript в odoo 12 - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть два поля, field1 - это флажок, а field2 - обычное текстовое поле. Я хочу скрыть поле field2, если поле field1 не проверено, и если установлено значение

field1, то show 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; 
});

Но поле 2 не скрывается, если поле 1 не проверено, а также поле 2 не отображается, если поле 1 отмечено.

Обновление

Мое требование состоит в том, чтобы у меня была одна форма, которая содержит поле one2many с виджетом many2many_tags и другими полями. После нажатия на теги many2many_tags я хочу отобразить полные записи в других полях. Я могу получить полные записи после нажатия на теги, а также эти записи можно поместить в другие поля. После использования attrs и открытия вида формы для создания записей field2 никогда не будет отображаться. Но откройте вид формы в режиме редактирования после создания записи и нажмите на поле many2many_tags field2 не отображается из-за атрибутов. При удалении атрибутов и открытии представления формы для создания поля записей отобразится (но не нужно отображаться, потому что field1 не отмечен) и откроется представление формы в режиме редактирования после создания записи, нажмите на many2many_tags, как и ожидалось. Условие атрибутов: attrs = "{'invisible': [('constr_mandatory', '! =', True)]}" constr_ обязательна: поле флажка
По этой причине я не использую attrs и пытается достичь с помощью javascript. Я надеюсь, что предоставленная информация понятна. Также я обновил вопрос и добавил скриншоты для лучшего понимания.

Использование attrs: enter image description here

Используя attrs, нажмите на many2many_tags enter image description here

Без использования атрибутов: enter image description here

Ответы [ 3 ]

2 голосов
/ 06 февраля 2020

Вы можете добавить новый виджет и переопределить метод 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);

Вам необходимо добавить атрибут виджета:

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

Редактировать
Вам нужно скрыть поля после загрузки формы, я предлагаю вам переопределить функцию autofocus FormRenderer.

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();
    },
});
0 голосов
/ 06 февраля 2020

Попробуйте 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;">
0 голосов
/ 06 февраля 2020

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

Эта строка устанавливает $checkbox в значение флажка. Может быть, вы просто хотите, чтобы сам элемент флажка:

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