如何通过ID从XML片段访问元素

Nil*_*nik 13 sapui5

我正在使用SAPUI5应用程序.我有一个XML视图,其中包含一个XML 片段和一个要保存的按钮.

该片段包含一些控件,如下拉列表,文本字段和表格.当我按下保存按钮时,我需要获取表中的所有行并调用OData更新服务.

问题出onSave在视图控制器中的方法中.使用其ID访问表时出错.任何人都可以帮助我并建议如何通过控制器中的ID访问片段中使用的控件?

这是代码片段:

----查看

<mvc:View xmlns:mvc="sap.ui.core.mvc" xmlns:core="sap.ui.core" xmlns:form="sap.ui.layout.form" xmlns="sap.m">
  <Page>
    ...
    <form:SimpleForm>
      <core:Fragment id ="fr1" fragmentName="first" type="XML"/>
      <Button id="id1" press="onSave"/>
    </form:SimpleForm>
  </Page>
</mvc:View>
Run Code Online (Sandbox Code Playgroud)

----片段定义

<core:FragmentDefinition xmlns="sap.m" xmlns:core="sap.ui.core">
  <Table id="tab1" mode="MultiSelect">
    ...
  </Table>
</core:FragmentDefinition>
Run Code Online (Sandbox Code Playgroud)

----控制器

sap.ui.controller("view", {
  onSave: function() {
    //var tab = this.getView().byId("tab1"); // Not working
    var tab  = sap.ui.getCore().byId("tab1"); // Not working
  },
  // ...
});
Run Code Online (Sandbox Code Playgroud)

Bog*_*ann 22

访问片段内的控件取决于首先创建片段的方式.以下是用于获取控件引用的相应API的案例列表:

要使用的API

this.byId("controlId");
Run Code Online (Sandbox Code Playgroud)

this.byId(Fragment.createId("fragmentId", "controlId"));
Run Code Online (Sandbox Code Playgroud)

Fragment.byId("fragmentId", "controlId");
Run Code Online (Sandbox Code Playgroud)

sap.ui.getCore().byId("controlId");
Run Code Online (Sandbox Code Playgroud)

  • 没有给出身份证时:

    sap.ui.xmlfragment("my.Fragment", this); // deprecated *
    // All control IDs within the fragment gets registered globally without any prefixes!!
    
    Run Code Online (Sandbox Code Playgroud)
  • 全球ID: "controlId"


*:sap.ui.*fragment不推荐使用API .Fragment.load改为使用(从1.58开始提供).

**:如果没有为视图指定稳定ID,则组件ID不会成为全局ID的一部分.在这种情况下,全局ID以生成的视图ID开头:"__xmlview0--...".


特定

  • this:引用控制器实例
  • Fragment:依赖关系定义给出的已解析模块的参数名称

    sap.ui.define([ // or .require
      "sap/ui/core/Fragment",
      // ...
    ], function(Fragment, /*...*/) { /*...*/});
    
    Run Code Online (Sandbox Code Playgroud)

注意

  • 避免连接ID部分或依赖于全局ID的语法,如注释文档中所述:

    不要依赖于特定的前缀语法,因为它可能会在某个时候发生改变.总是使用像byId()和的方法createId().

  • 当意图实际上是要改变片段控件中使用的某些数据时(例如myManuallyAccessedInput.setValue("...")),请考虑避免使用上述API .改为使用数据绑定 ⇒模型中的更改将自动反映在UI中.


sch*_*del 18

看着在GitHub上openui5代码似乎片段代表当地的ID生成的含观点,如果<Fragment/>本身并没有有明确的标识.

因此this.getView().byId("tab1"),只要id="fr1"<Fragment/>元素中删除属性,代码就应该可以正常工作.

使用显式ids时,有一个静态Fragment.byId()方法来检索控件.我想你必须像这样使用它:

var fragmentId = this.getView().createId("fr1");
var tab = sap.ui.core.Fragment.byId(fragmentId, "tab1");
Run Code Online (Sandbox Code Playgroud)