我的模型中有以下数据:
{
vertexTable: [
{
"NAME": "Tethys",
"TYPE":"titan",
"RESIDENCE":"Othrys"
},
{
"NAME": "Oceanus",
"TYPE": "titan",
"RESIDENCE": "Othrys"
}
],
vertexAttributes: [
{
"COLUMN_NAME": "NAME",
"DATA_TYPE_NAME": "VARCHAR"
},
{
"COLUMN_NAME": "TYPE",
"DATA_TYPE_NAME": "VARCHAR"
},
{
"COLUMN_NAME": "RESIDENCE",
"DATA_TYPE_NAME": "VARCHAR"
}
]
}我希望在我的视图中显示这些数据,以便有一个来自vertexAttributes/COLUMN_NAME的标签,并且每个标签都有一个相关的下拉/复选框。
vertexTable/NAME,vertexTable/TYPE,以及vertexTable/RESIDENCE。我考虑使用一个表单控件,它具有聚合绑定到formElements="{/vertexattributes}",然后每个表单元素从vertexAttributes绑定到"{COLUMN_NAME}"。但是现在,我想将Select绑定到vertexTable,然后将项绑定到NAME、TYPE和RESIDENCE。
下面是我在视图中尝试过的代码:
<f:form>
<f:FormContainer formElements="{/vertexAttributes}">
<f:FormElement label="{COLUMN_NAME}">
<List id="values" items="{path: 'VALUES', templateShareable: false}">
<StandardListItem title="{value}"></StandardListItem>
</List>
</f:FormElement>
</f:FormContainer>
</f:form>我不得不使用templateShareable,因为我得到了一个错误。不完全确定是什么。
另外,我使用的是一个列表来显示完整的值,而不是选择/下拉。

这是正确的方法,还是有更好的方法?我遇到了工厂功能,但我无法实现它。
发布于 2018-01-02 16:44:47
下面是一个有用的例子:
sap.ui.getCore().attachInit(() => sap.ui.require([
"sap/ui/model/json/JSONModel",
"sap/ui/layout/form/FormElement",
"sap/m/Label",
"sap/m/Select",
"sap/ui/core/Item",
], (JSONModel, FormElement, Label, Select, Item) => sap.ui.xmlview({
viewContent: `<mvc:View
xmlns:mvc="sap.ui.core.mvc"
xmlns:form="sap.ui.layout.form"
xmlns="sap.m"
controllerName="demo.MyController"
>
<form:Form editable="true">
<form:layout>
<form:ResponsiveGridLayout/>
</form:layout>
<form:FormContainer
formElements="{
path: '/vertexAttributes',
factory: '.createFormElement'
}"
/>
</form:Form>
</mvc:View>`,
controller: sap.ui.controller("demo.MyController", {
createFormElement: function(id, context) {
const columnName = context.getProperty("COLUMN_NAME");
return new FormElement(id).setLabel(new Label({
text: columnName,
})).addField(new Select().bindItems({
path: "/vertexTable",
template: new Item().bindProperty("text", columnName),
}));
},
}),
}).setModel(new JSONModel({
vertexTable: [{
"NAME": "Tethys",
"TYPE": "Titan1",
"RESIDENCE": "Othrys1"
},
{
"NAME": "Oceanus",
"TYPE": "Titan2",
"RESIDENCE": "Othrys2"
},
],
vertexAttributes: [{
"COLUMN_NAME": "NAME",
"DATA_TYPE_NAME": "VARCHAR"
},
{
"COLUMN_NAME": "TYPE",
"DATA_TYPE_NAME": "VARCHAR"
},
{
"COLUMN_NAME": "RESIDENCE",
"DATA_TYPE_NAME": "VARCHAR"
},
]
})).placeAt("content")));<script src="https://openui5.hana.ondemand.com/resources/sap-ui-core.js" id="sap-ui-bootstrap"
data-sap-ui-libs="sap.ui.layout, sap.m, sap.ui.core"
data-sap-ui-preload="async"
data-sap-ui-theme="sap_belize"
data-sap-ui-compatVersion="edge"
data-sap-ui-resourceRoots='{"demo": "./"}'
data-sap-ui-xx-waitForTheme="true"></script>
<body id="content" class="sapUiBody sapUiSizeCompact"></body>
数据结构的设计有些可疑。在其他对象中,(vertexAttributes/COLUMN_NAME的)值是( vertexTable/*)的关键,这使得实现变得复杂。尽管如此,正如您之前已经尝试过的,使用工厂函数显示适当的数据仍然是可能的。
上面的示例在createFormElement调用的每次迭代中创建一个Select。然后,select项可以将其文本绑定到当前的columnName作为路径。
关于templateShareable:https://stackoverflow.com/a/47734086/5846045
https://stackoverflow.com/questions/48007905
复制相似问题