我坚持认为SAPUI5中是否可以使用概念,并且由于文档在这个详细程度上可能有点难以处理,我在研究路径中提出的问题比正常情况要早.主要是我不想花太多时间,如果有一个立即'否'的答案.
我有一个使用JSON模型的主视图的用例,但我必须生成自己的控件 - 我不能使用SplitApp等.
该模型实际上是一个2层深的树,主要导致细节.从概念上讲是这样的:
{
"master": [
{
"name": "Master 1",
"detail" : [
{
"name": "Detail 1-1"
},
{
"name": "Detail 1-2"
}
]
},
{
"name": "Master 2",
"detail" : [
{
"name": "Detail 2-1"
},
{
"name": "Detail 2-2"
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
UX是一个可选择的主列表,当进行选择时,将刷新详细列表控件以显示所选主节点的子节点的详细信息.
我熟悉将模型绑定到视图
sap.ui.getCore().setModel(oModel)
this.getView().setModel(oModel)
Run Code Online (Sandbox Code Playgroud)
但是根据我迄今为止的学习情况,这会将视图中的所有控件绑定到一个模型.
我认为可能值得追求的选择是:
进一步解释2,如果说我正在使用表格进行详细显示,我可能会在表格def中使用
<Table
id="detailList"
items="{
path: '/'
}",
...
>
Run Code Online (Sandbox Code Playgroud)
所以我希望修改类似的路径
path: '/master[n]/detail/'
Run Code Online (Sandbox Code Playgroud)
其中n表示选定的主实例.
是可能的,还是有另一种选择,或者我应该放弃.
编辑:我在这里发现了Michael Herzog这种基于过滤器的潜在解决方案.他的描述是:
我将举例说明如何在SAPUI5中实现matser-detail关系.
使用案例:当用户点击第一个表中的客户端时,所有相关订单都应显示在第二个表中.应隐藏其他客户的订单.
因此,在我们看来,我们有两个表:
表:客户
表:订单
创建两个表并设置数据绑定后,在第一个表上实现此事件处理程序:
oTableClients.attachRowSelectionChange( function(oEvent){
// first, we fetch the binding context of the selected row
var selectedRowContext = oEvent.getParameter("rowContext");
// get the ID of the customer via rowContext. The model-object represents the data of the first table
var selectedClientId = oModel,getProperty("id", selectedRowContext);
// get binding of second table
var ordersBinding = oTableOrders.getBinding();
//create new filter to show the relevant data for the selected customer
var oFilter = new sap.ui.model.Filter("clientId", sap.ui.model.FilterOperation.EQ, selectedClientId);
// apply filter to binding
ordersBinding.filter([oFilter]);
});
Run Code Online (Sandbox Code Playgroud)
我可以看到这种方法对我来说是可行的 - 有什么理由说明这种模式存在根本缺陷吗?
一般来说,您的视图可以包含您喜欢的模型.唯一的限制是只能有一个无名模型,即所有其他模型都需要命名.以下代码显示了差异:
this.getView().setModel(new JSONModel(data));
this.getView().setModel(new JSONModel(data), name));
Run Code Online (Sandbox Code Playgroud)
要绑定命名模型,必须在绑定指令中提供其名称,否则运行时使用无名模型.以下示例显示了差异(请注意,除非您要提供其他参数,否则可以使用短绑定语法,即您可以省略该path属性:
<Table items="{/path}">
<Table items="{name>/path}">
Run Code Online (Sandbox Code Playgroud)
在您的示例中,我建议使用一个模型并使用绑定上下文来控制详细信息表中显示的数据.
详细信息表的绑定应该是相对的,如下所示:
<Table id="detailList" items="{detail}">
Run Code Online (Sandbox Code Playgroud)
处理主列表选择的处理程序如下:
onMasterItemSelect : function(event) {
// get the binding context of the currently selected master item, e.g. /master/0
var masterBindingContext = event.getParameter("listItem").getBindingContext();
// bind detail table to the selected master item using bindElement
this.byId("details").bindElement(masterBindingContext.getPath());
}
Run Code Online (Sandbox Code Playgroud)