Как сфокусировать поле, которое находится в форме transientmodel в odoo?

Я только что понял, что default_focus="1" не работает для полей в представлениях переходной модели (по крайней мере, тех, которые открыты с помощью target="new"). И autofocus="autofocus", который, как я думал, должен использоваться только с buttons или pages, работает для этих полей Transient Model, но только при первом открытии представления. Он не будет работать снова, если вы не перезагрузите браузер.

В моем случае я создал виджет для поля Char (внутри переходной модели), и мне нужно, чтобы это поле фокусировалось каждый раз при открытии всплывающего окна. Поскольку я не могу сделать это с помощью XML, я пытаюсь сделать это с помощью JavaScript.

Это XML-шаблон моего виджета, унаследованного от FieldChar:

<t t-name="FieldRed" t-extend="FieldChar">
    <t t-jquery="input" t-operation="attributes">
        <attribute name="id">barcode_input</attribute>
        <attribute name="class">o_form_input bg-red</attribute>
    </t>
</t>

Теперь JS-код моего виджета. Я пытаюсь сфокусировать его на методе start, потому что это первый метод, выполняемый после рендеринга:

start: function() {
    console.log('START');
    this._super.apply(this, arguments);
    this.$el.parent().find('input').focus();
},

Но это не работает. Я также пробовал:

this.setupFocus(this.$el.parent().find('input'));

Но ничего не произошло. Однако, если я включу эту строку, например, поле будет автоматически заполнено, как и ожидалось:

this.$el.parent().find('input').val('START');

Итак, мой вопрос:

Как я могу фокусировать поле input виджета при каждом открытии формы?

3
0
1 128
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Наконец, я только что нашел простой способ решения этой проблемы. Я просто жду 50 миллисекунд, прежде чем вызвать на focus с setTimeout. Я предполагаю, что ядро ​​Odoo автоматически перемещает фокус куда-нибудь, когда вызывается start, если я дождусь окончания этого действия, а затем перемещу фокус куда захочу, это сработает. Хотя решение мне не нравится, но на данный момент оно единственное, что у меня есть:

start: function() {
    this._super.apply(this, arguments);
    self = this;
    setTimeout(function(){
        self.$el.parent().find('input').focus();
    }, 50);
},

Я сделал это с помощью простого jquery.

Я добавляю класс в поле и пишу сценарий во всплывающем окне для просмотра.

как показано ниже.

<form string="Stock Disposal">
                <sheet>
                    <script>
                        $('.my-focus-field').focus()

                    </script>

                    <div class="oe_title">
                        <h1>
                            Stock Disposal
                        </h1>
                    </div>
                    <group>
                        <field name="serial_number" class="my-focus-field"/>
                    </group>
                </sheet>
            </form>

Сообщите мне, если это не так.

Когда я комбинирую оба ответа, это работает как шарм! Поместите JS-скрипт в форму и подождите 50 мс (с setTimeout) перед фокусировкой.

Minh Nguyen 27.07.2021 18:44

Другие вопросы по теме