SAPUI5删除聚合绑定中的重复项

时间:2017-03-03 19:58:38

标签: javascript data-binding filter sapui5

我使用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>

3 个答案:

答案 0 :(得分:0)

是否有任何特殊原因未将过滤器值直接绑定到客户实体集?这样每个客户只会出现一次。不幸的是,使用OData v2,您无法过滤掉没有订单的客户。为此,您必须从后端获得一个专门的实体集(基于视图)。

相反,您无法真正过滤直接删除重复项。您可以尝试使用分组进行某种解决方法(我真的不认为您可以实现此目的),您可以在JSON模型中读取所有数据并手动执行此过滤,或者您可以尝试切换OData列表绑定操作模式为“客户端”(实际上将读取所有订单 - &gt;不完美)并实现自定义过滤功能以删除重复项。

答案 1 :(得分:0)

如果您按客户排序,然后在表中首先放置CustomerId列,然后放置OrderId列(您的示例引用),则可以使用Customer列的//console.log('stuff');属性。

这会阻止客户标识符重复 - 这可能是您的意图吗?

答案 2 :(得分:0)

如果项目条目很多,那么在客户端手动删除重复项可能不是最佳选择。此外,来自V2的filter查询不支持在扩展集合中查找另一方面支持V4的任何属性。

我建议在绑定路径中使用客户(而不是项目),并通过定义custom query让后端了解您的需求,以便只获得具有一个或多个项目的客户。< / p>