如何在 Odoo 中聚焦一个 TransientModel 形式的字段?

How to focus a field which is in a TransientModel form in Odoo?

我刚刚意识到 default_focus="1" 不适用于瞬态模型视图中的字段(至少是使用 target="new" 打开的字段)。 autofocus="autofocus",我认为它应该只与 buttonspages 一起使用,适用于那些瞬态模型字段,但仅在您第一次打开视图时有效。除非您重新加载浏览器,否则它不会再次运行。

在我的例子中,我为 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 字段?

最后,我刚刚找到了一个简单的解决方法。在使用 setTimeout 调用 focus 之前,我只等待 50 毫秒。我想当 start 被调用时,Odoo 核心会自动将焦点移动到某个地方,如果我等待该操作结束,然后将焦点移动到我想要的任何地方,它就可以工作。虽然这不是我喜欢的解决方案,但目前它是我唯一拥有的解决方案:

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

我用一个简单的 jquery 做到了。

我在字段中添加了一个 class 并在弹出窗口中编写脚本以供查看。

如下图。

<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>

如果方法不对请告诉我。