我正在开发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
},
// ...
});
答案 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的案例列表:
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()
等方法。
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”)和任何其他控件一样。