我正在使用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的案例列表:
this.byId("controlId");Run Code Online (Sandbox Code Playgroud)使用视图ID创建片段时:
sap.ui.xmlfragment(this.getView().getId(), "my.Fragment", this); // deprecated *Run Code Online (Sandbox Code Playgroud)
<core:Fragment fragmentName="my.Fragment" type="XML" />
<!-- View ID will be automatically propagated in XMLView -->Run Code Online (Sandbox Code Playgroud)全球ID:"componentId---viewId--controlId"**
this.byId(Fragment.createId("fragmentId", "controlId"));Run Code Online (Sandbox Code Playgroud)当视图ID 和一个片段ID给予:
sap.ui.xmlfragment(this.createId("fragmentId"), "my.Fragment", this); // deprecated *Run Code Online (Sandbox Code Playgroud)
<core:Fragment id="fragmentId" fragmentName="my.Fragment" type="XML"/>Run Code Online (Sandbox Code Playgroud)全球ID:"componentId---viewId--fragmentId--controlId"**
Fragment.byId("fragmentId", "controlId");Run Code Online (Sandbox Code Playgroud)当片段ID唯一:
sap.ui.xmlfragment("fragmentId", "my.Fragment", this); // deprecated *Run Code Online (Sandbox Code Playgroud)全球ID: "fragmentId--controlId"
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)