【问题标题】:How to focus a field which is in a TransientModel form in Odoo?如何在 Odoo 中聚焦 TransientModel 表单中的字段?
【发布时间】:2018-09-10 09:33:39
【问题描述】:

我刚刚意识到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 字段?

【问题讨论】:

    标签: javascript xml focus odoo odoo-10


    【解决方案1】:

    我使用了一个简单的 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),然后再聚焦。
    • 完美,工作
    【解决方案2】:

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

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

    【讨论】:

    • 专家级别,但没用。如果我们必须做 100 件事,只在 odoo 中做焦点,这是糟糕的 odoo 框架。
    猜你喜欢
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多