Sapui5 如何在视图中设置初始焦点?

Sapui5 如何在视图中设置初始焦点?,sapui5,Sapui5,我在SAPUI5应用程序中有一个详细视图,其中包含一个ID为“bestellmenge_tu”的输入字段。无论何时调用此视图,焦点都应放在该输入字段上。不幸的是,在控制器的onInit方法中对字段设置焦点时,将设置焦点,但几毫秒后,UI5将焦点移走,并将其转移到细节视图的“导航后退”按钮 通过将log.trace()放在输入字段的blur事件上,我发现焦点被一个名为sap.ui.define.NavContainer.\u PostTransitionCallback的方法拿走了,该方法是异步调

我在SAPUI5应用程序中有一个详细视图,其中包含一个ID为“bestellmenge_tu”的输入字段。无论何时调用此视图,焦点都应放在该输入字段上。不幸的是,在控制器的
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>