如何按ID

时间:2016-09-23 11:54:45

标签: sapui5

我正在开发SAPUI5应用程序。我有一个XML视图,其中包含XML Fragment和要保存的按钮。

该片段包含一些控件,如下拉列表,文本字段和表格。 当我按下保存按钮时,我需要获取表中的所有行并调用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>

----片段定义

<core:FragmentDefinition xmlns="sap.m" xmlns:core="sap.ui.core">
  <Table id="tab1" mode="MultiSelect">
    ...
  </Table>
</core:FragmentDefinition>

----控制器

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

3 个答案:

答案 0 :(得分:15)

查看github上的openui5代码,如果<Fragment/>本身具有显式ID,则Fragment会将本地ID生成委托给包含视图。

因此,只要从this.getView().byId("tab1")元素中删除id="fr1"属性,您的代码<Fragment/>即可生效。

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

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

答案 1 :(得分:15)

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

使用的API

this.byId("controlId");

  • 使用视图ID

    创建片段时
    sap.ui.xmlfragment(this.getView().getId(), "my.Fragment", this); // deprecated *
    <core:Fragment fragmentName="my.Fragment" type="XML" />
    <!-- View ID will be automatically propagated in XMLView -->
  • 全球ID:"componentId---viewId--controlId" **

this.byId(Fragment.createId("fragmentId", "controlId"));

  • 视图ID 片段ID 时,

    sap.ui.xmlfragment(this.createId("fragmentId"), "my.Fragment", this); // deprecated *
    <core:Fragment id="fragmentId" fragmentName="my.Fragment" type="XML"/>
  • 全球ID:"componentId---viewId--fragmentId--controlId" **

Fragment.byId("fragmentId", "controlId");

  • 片段ID 时:

    sap.ui.xmlfragment("fragmentId", "my.Fragment", this); // deprecated *
  • 全球ID:"fragmentId--controlId"

sap.ui.getCore().byId("controlId");

  • 当没有给出身份证时:

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


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

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

鉴于

  • this:对控制器实例的引用
  • Fragment:依赖关系定义

    给出的已解析模块的参数名称
    sap.ui.define([ // or .require
      "sap/ui/core/Fragment",
      // ...
    ], function(Fragment, /*...*/) { /*...*/});
    

注意

  • 避免连接ID部分或依赖全局ID的语法,如comment以及documentation中所述:

      

    依赖于特定的前缀语法,因为它可能会在某些时候发生变化。始终使用byId()createId()等方法。

  • 考虑以避免在意图实际上改变片段控件中使用的某些数据时使用上述API(例如myManuallyAccessedInput.setValue("..."))。使用data binding代替⇒模型中的更改将自动反映在UI中。

答案 2 :(得分:2)

为了使它在没有显式片段ID且没有静态Fragment.byId()的情况下工作,我使用了以下代码片段:

var prefix = this.getView().createId("").replace("--", "");
var fragment = sap.ui.xmlfragment(prefix, "-- XML fragment name --", this);

在此之后你可以使用this.getView()。byId(“tab1”)和任何其他控件一样。