2017-03-03 24 views
1

我正在使用UI5渲染一个表并使用ViewSettingsDialog控件进行排序/组/筛选。 在我的OData服务中,我有一个“项目”实体集,每个实体都有一个客户关联(一个客户可以有多个项目)。 另一方面,我有一个“客户”实体集。它显示了超过1000个条目的客户,但并非所有客户都有一个项目正在进行,所以我无法将它用于ViewSettingsFilterItem中的项目聚合。SAPUI5删除聚合绑定中的重复项

要允许客户ViewSettingsDialog筛选器,我传递为ViewSettingsFilterItem中的项目aggragetion设置的“项目”实体。但那些有多个项目持续进行的客户出现不止一次。

我怎样才能限制绑定只显示客户多个项目?

检查这段代码使用罗斯文: 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

我想知道为什么你不能按项目名称分组客户ID?这样,您可以为每个项目分别设置不同的部分,每个项目都会显示客户ID。甚至根据客户ID本身进行分组。让我知道这是否有帮助。 https://sapui5.hana.ondemand.com/#docs/guide/c4b2a32bb72f483faa173e890e48d812.html –

+0

嗨Rahul,我也在我的应用程序(而不是片段)中实施gouping,但无论如何,我需要实现过滤器功能。 我应该呈现一个包含许多条目(7列)的原始响应表 ,并提供** Sorting&Grouping&Filtering **列值 这就是为什么我使用ViewSettingsDialog控件https://sapui5.hana.ondemand.com /explored.html#/sample/sap.m.sample.TableViewSettingsDialog/preview 分组和排序工作正常,但我有过滤器描述的问题。 –

+0

嗨拉斐尔,我只是想提一提,你可能想考虑使用[sap.ui.table.Table](https://openui5.hana.ondemand.com/explored.html#/entity/sap.ui.table .Table/samples)而不是sap.m.Table。后者控制并不意味着要处理大量的数据,并且在7列(尤其是IE)上会出现明显的性能问题。我不得不经历痛苦的​​经历。 – boghyon

回答

0

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

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

+1

最后,我做了类似于您所解释的内容。 这里[Snippet](https://jsbin.com/coraperisa/edit?html,output) –

0

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

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

+0

谢谢你Serban! 这就是我认为...似乎“独特”的电话不能对OData服务完成。 我正在考虑在客户端使用JS过滤它们,但是如果有许多条目(如Northwind Orders entitySet中)与同一个客户,我将遇到问题...我没有检索所有条目,因此,我只是一个客户... –

0

如果要按客户进行排序,然后在表格中先放置CustomerId列,然后放置OrderId列(您的示例参考),然后您可以使用Customer列的<Column mergeDuplicates="true" ... />属性。

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

+0

嗨伯纳恩,谢谢,但问题不在表中。表格可以重复客户。 问题出在** ViewSettingsFilterItem **项目聚合中,因此当您选择过滤器时,复选框列表会与同一个客户多次出现 –