Sapui5 如何在视图中设置初始焦点?
我在SAPUI5应用程序中有一个详细视图,其中包含一个ID为“bestellmenge_tu”的输入字段。无论何时调用此视图,焦点都应放在该输入字段上。不幸的是,在控制器的Sapui5 如何在视图中设置初始焦点?,sapui5,Sapui5,我在SAPUI5应用程序中有一个详细视图,其中包含一个ID为“bestellmenge_tu”的输入字段。无论何时调用此视图,焦点都应放在该输入字段上。不幸的是,在控制器的onInit方法中对字段设置焦点时,将设置焦点,但几毫秒后,UI5将焦点移走,并将其转移到细节视图的“导航后退”按钮 通过将log.trace()放在输入字段的blur事件上,我发现焦点被一个名为sap.ui.define.NavContainer.\u PostTransitionCallback的方法拿走了,该方法是异步调
onInit
方法中对字段设置焦点时,将设置焦点,但几毫秒后,UI5将焦点移走,并将其转移到细节视图的“导航后退”按钮
通过将log.trace()
放在输入字段的blur
事件上,我发现焦点被一个名为sap.ui.define.NavContainer.\u PostTransitionCallback
的方法拿走了,该方法是异步调用的(触发器和执行之间的一些window.setTimeout
s)。该函数只是在视图中查找第一个可聚焦的元素,并在其上粗暴地切换焦点
我的解决方法是重新定义方法jQuery.fn.firstFocusableDomRef
,该方法用于查找“第一个可聚焦元素”:
但这可能是一个性能问题(querySelector
在DOM横向加载期间从那里开始的任何页面加载过程中调用),而且编码太多,无法达到预期效果
有没有更简单的方法来实现这一点
我想到了类似的事情
<mvc:View controllerName="zrt_dispo.view.Detail"...>
<Page id="detailPage" initialFocus="bestellmenge_tu"> <!-- ID of the element to carry the focus -->
</Page>
</mvc:view>
导航容器有一个属性
App
是NavContainer
的后代,因此它也具有该属性。
帮助(如上链接)说明了以下内容:
确定是否在首次呈现时以及导航到新页面后自动设置初始焦点。当触摸设备上的键盘因焦点自动设置在输入字段上而弹出时,此功能非常有用。如有必要,“afterShow”事件可用于聚焦另一个元素
默认值为true
以下是一个工作示例:
或in),它的直接子对象,aka。它通常是一个视图,可以对导航相关事件作出反应。在本例中,我们应该根据API引用将处理程序附加到事件:
只有当autoFocus
设置为false
时,才能使用afterShow
事件聚焦另一个元素
事件处理程序在动画完成后启动。最重要的是:
每次当NavContainer使该子控件可见时,都会触发该事件(与渲染后的相反)
由于sap.ui.core.Control
扩展了sap.ui.core.Element
,每个控件都可以通过接收焦点
注
- 如中所述,Fiori Launchpad(FLP)对应用程序启动的第一个关注点是由Launchpad控制的,目前没有API来改变这种行为
- 在UI5 1.62及以下版本中,在
onAfterShow
中单独调用focus()
,即使使用autoFocus=“false”
,当用户返回时,应用程序仍会将焦点设置在第一个可聚焦元素上(参见此)。因此,需要使用0
ms(或)的附加字符,以便让浏览器知道该元素应聚焦在页面末尾。
onAfterShow:function()的{
//仅当UI5版本<1.63时:
setTimeout(()=>this.byId(“thatControl”).focus();
},
使用,修复程序从1.63开始提供
<mvc:View controllerName="zrt_dispo.view.Detail"...>
<Page id="detailPage" initialFocus="bestellmenge_tu"> <!-- ID of the element to carry the focus -->
</Page>
</mvc:view>