我使用UI5渲染表并使用ViewSettingsDialog控件进行排序/分组/过滤。 在我的OData服务中,我有一个"项目"实体集,每个客户都有一个客户关联(一个客户可以有多个项目)。 另一方面,我有一个"客户"实体集。它显示了1000多个条目客户,但并非所有客户都有正在进行的项目,因此我无法将其用于ViewSettingsFilterItem中的项目聚合。
要允许客户使用ViewSettingsDialog过滤器,我将传递"项目"为ViewSettingsFilterItem中的项目aggragetion设置的实体。但那些有多个项目正在进行的客户不止一次出现。
如何限制绑定只显示具有多个项目的客户?
使用Northwind检查此代码段: https://jsbin.com/sakurisoxo/edit?html,output
如果你去过滤器,你可以看到它们是如何重复的
提前谢谢
[代码]
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>SAPUI5</title>
<script src="https://sapui5.hana.ondemand.com/resources/sap-ui-core.js"
id="sap-ui-bootstrap"
data-sap-ui-theme="sap_belize"
data-sap-ui-libs="sap.m"
data-sap-ui-bindingSyntax="complex"
data-sap-ui-compatVersion="edge"
data-sap-ui-preload="async"></script>
<!-- use "sync" or change the code below if you have issues -->
<!-- XMLView -->
<script id="myXmlView" type="ui5/xmlview">
<mvc:View
controllerName="MyController"
xmlns="sap.m"
xmlns:core="sap.ui.core"
xmlns:mvc="sap.ui.core.mvc">
<Table
id="myTable"
growing="true"
growingThreshold="25"
growingScrollToLoad="true"
busyIndicatorDelay="0"
items="{/Orders}">
<headerToolbar>
<Toolbar>
<Title text="Orders of ALFKI"/>
<ToolbarSpacer/>
<Button text="Click here for filters" press="onDialogOpen"/>
</Toolbar>
</headerToolbar>
<columns>
<Column>
<Text text="OrderID"/>
</Column>
<Column>
<Text text="CustomerID"/>
</Column>
</columns>
<items>
<ColumnListItem>
<cells>
<Text text="{OrderID}"/>
<Text text="{CustomerID}"/>
</cells>
</ColumnListItem>
</items>
</Table>
</mvc:View>
</script>
<!-- XML Fragment -->
<script id="myXMLFragment" type="ui5/fragment">
<core:FragmentDefinition
xmlns="sap.m"
xmlns:core="sap.ui.core">
<ViewSettingsDialog
confirm="onTableSettingsConfirm">
<sortItems>
<ViewSettingsItem text="OrderID" key="OrderID" selected="true" />
</sortItems>
<filterItems>
<ViewSettingsFilterItem
text="CustomerID"
key="CustomerID"
multiSelect="true"
items="{path: '/Orders', sorter: [{path: 'CustomerID', descending: false}]}">
<items>
<ViewSettingsItem text="{CustomerID}" key="{CustomerID}" />
</items>
</ViewSettingsFilterItem>
</filterItems>
</ViewSettingsDialog>
</core:FragmentDefinition>
</script>
<script>
sap.ui.getCore().attachInit(function () {
"use strict";
//### Controller ###
sap.ui.define([
"sap/ui/core/mvc/Controller",
"sap/ui/model/odata/v2/ODataModel"
], function (Controller, ODataModel) {
"use strict";
return Controller.extend("MyController", {
_oTableSettingsDialog: null,
onInit : function () {
this.getView().setModel(
new ODataModel("https://cors-anywhere.herokuapp.com/services.odata.org/V2/Northwind/Northwind.svc/")
);
},
onDialogOpen: function(){
if (!this._oTableSettingsDialog) {
this._oTableSettingsDialog = sap.ui.xmlfragment({
fragmentContent : jQuery("#myXMLFragment").html()
});
this._oTableSettingsDialog.setModel(this.getView().getModel());
}
this._oTableSettingsDialog.open();
}
});
});
//### THE APP: place the XMLView somewhere into DOM ###
sap.ui.xmlview({
viewContent : jQuery("#myXmlView").html()
}).placeAt("content");
});
</script>
</head>
<body class="sapUiBody">
<div id="content"></div>
</body>
</html>
答案 0 :(得分:0)
是否有任何特殊原因未将过滤器值直接绑定到客户实体集?这样每个客户只会出现一次。不幸的是,使用OData v2,您无法过滤掉没有订单的客户。为此,您必须从后端获得一个专门的实体集(基于视图)。
相反,您无法真正过滤直接删除重复项。您可以尝试使用分组进行某种解决方法(我真的不认为您可以实现此目的),您可以在JSON模型中读取所有数据并手动执行此过滤,或者您可以尝试切换OData列表绑定操作模式为“客户端”(实际上将读取所有订单 - &gt;不完美)并实现自定义过滤功能以删除重复项。
答案 1 :(得分:0)
如果您按客户排序,然后在表中首先放置CustomerId列,然后放置OrderId列(您的示例引用),则可以使用Customer列的//console.log('stuff');
属性。
这会阻止客户标识符重复 - 这可能是您的意图吗?
答案 2 :(得分:0)
如果项目条目很多,那么在客户端手动删除重复项可能不是最佳选择。此外,来自V2的filter
查询不支持在扩展集合中查找另一方面支持V4的任何属性。
我建议在绑定路径中使用客户(而不是项目),并通过定义custom query让后端了解您的需求,以便只获得具有一个或多个项目的客户。< / p>