如何在 Odoo 中聚焦一个 TransientModel 形式的字段?
How to focus a field which is in a TransientModel form in Odoo?
我刚刚意识到 default_focus="1"
不适用于瞬态模型视图中的字段(至少是使用 target="new"
打开的字段)。 autofocus="autofocus"
,我认为它应该只与 buttons
或 pages
一起使用,适用于那些瞬态模型字段,但仅在您第一次打开视图时有效。除非您重新加载浏览器,否则它不会再次运行。
在我的例子中,我为 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>
如果方法不对请告诉我。
我刚刚意识到 default_focus="1"
不适用于瞬态模型视图中的字段(至少是使用 target="new"
打开的字段)。 autofocus="autofocus"
,我认为它应该只与 buttons
或 pages
一起使用,适用于那些瞬态模型字段,但仅在您第一次打开视图时有效。除非您重新加载浏览器,否则它不会再次运行。
在我的例子中,我为 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>
如果方法不对请告诉我。