【问题标题】:SAPUI5 Remove duplicates in aggregation bindingSAPUI5 删除聚合绑定中的重复项
【发布时间】:2017-07-24 01:36:59
【问题描述】:

我正在使用 UI5 呈现表格并使用 ViewSettingsDialog 控件进行排序/分组/过滤。 在我的 OData 服务中,我有一个“项目”实体集,每个实体都有一个关联的客户(一个客户可以有多个项目)。 另一方面,我有一个“客户”实体集。它显示了 1000 多个条目客户,但并非所有客户都有正在进行的项目,因此我无法将其用于 ViewSettingsFilterItem 中的项目聚合。

为了允许按客户进行 ViewSettingsDialog 过滤器,我正在为 ViewSettingsFilterItem 中的项目聚合传递“项目”实体集。但是那些有不止一个项目正在进行的客户出现不止一次。

如何将绑定限制为只显示一次,让客户拥有多个项目?

使用 Northwind 检查这个 sn-p: 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>

【问题讨论】:

  • 我想知道为什么不能按项目名称对客户 ID 进行分组?这样,您可以为每个项目设置单独的部分,并且每个项目都会在其中显示客户 ID。甚至可以按客户 ID 本身进行分组。让我知道这是否有帮助。 sapui5.hana.ondemand.com/#docs/guide/…
  • 嗨 Rahul,我也在我的应用程序中实现了 gouping(不是在 sn-p 中),但无论如何我需要实现过滤器功能。我应该呈现一个包含许多条目(7 列)的原始响应表,并为 Sorting&Grouping&Filtering 列值提供可能性这就是为什么我使用 ViewSettingsDialog 控件sapui5.hana.ondemand.com/explored.html#/sample/… Grouping 和 Sorting 工作顺利,但我过滤器有描述的问题。
  • 嗨 Rafael,我只想提一下,您可能需要考虑使用 sap.ui.table.Table 而不是 sap.m.Table。后一个控件并不意味着处理大量数据,并且会在 7 列(尤其是在 IE 上)存在显着的性能问题。我不得不通过痛苦的经验来学习它。

标签: javascript data-binding filter sapui5


【解决方案1】:

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

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

【讨论】:

  • 谢谢塞尔班!这就是我的想法……似乎无法针对 OData 服务进行“唯一”调用。我正在考虑使用 JS 在客户端过滤它们,但是如果有很多条目(例如在 Northwind Orders entitySet 中)具有相同的客户,我会遇到问题......我没有检索所有条目,因此,我有只是客户的一部分......
【解决方案2】:

如果您要按客户排序,然后在您的表中,首先放置 CustomerId 列,然后是 OrderId 列(您的示例引用),您可以使用 &lt;Column mergeDuplicates="true" ... /&gt; 属性作为客户列。

这将防止客户标识符重复 - 这可能是您的意图?

【讨论】:

  • 您好 Bernand,谢谢,但问题不在表格中。这张桌子很好,顾客被重复了。问题出在 ViewSettingsFilterItem 项目聚合中,因此当您选择过滤器时,复选框列表会多次显示同一个客户
【解决方案3】:

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

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

【讨论】:

  • 最后我做了你解释的事情。这里Snippet
猜你喜欢
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多