Sapui5 基于嵌套聚合绑定的过滤

Sapui5 基于嵌套聚合绑定的过滤,sapui5,Sapui5,我希望能够对嵌套聚合绑定应用过滤器,但它似乎不起作用。以下是XML: <l:Grid id="test" defaultSpan="L6 M6 S6" content="{path : 'test>/', templateShareable:false}"> <l:content> <VBox width="100%"> <HBox height="100px" alignItems="Center" justifyCont

我希望能够对嵌套聚合绑定应用过滤器,但它似乎不起作用。以下是XML:

<l:Grid id="test" defaultSpan="L6 M6 S6" content="{path : 'test>/', templateShareable:false}">
  <l:content>
    <VBox width="100%">
      <HBox height="100px" alignItems="Center" justifyContent="Start">
        <VBox alignItems="Center" width="25%">
          <core:Icon src="{test>icon}" width="100%" />
          <Text text="{test>text}" width="100%"/>
        </VBox>
        <VBox id="test" height="80px" items="{path: 'test>data/', templateShareable:false}">
          <Link text="{parts: [{ path: 'test>key'}, 
                               { path: 'test>value' }], 
                                 formatter : 'dostuff'}"/>
        </VBox>
      </HBox>
    </VBox>
  </l:content>
</l:Grid>
}

我希望能够对测试>/results/[n]/data/[n]/[value1+value2]进行过滤,并在该级别对网格进行过滤。无论我尝试什么,它都只会过滤网格内容,因为我似乎无法获得VBox“测试”中的绑定

干杯


James

您是否正在尝试从JS动态筛选内容?还是直接从XML静态地?我假设你想从JS开始

id为的VBox测试位于已绑定其内容聚合的网格内。这意味着网格内的整个VBox(包括测试VBox)被视为网格内容聚合的模板(即,使用我们的JSON,您将拥有两个VBox副本)

使用这个.byId(“test”)显然不起作用,因为它将返回一个控件,该控件是网格内容聚合模板的一部分。因此,为了能够过滤内部VBox(因为根据模型的内容,将有多个VBox),您必须迭代网格的内容,并将过滤应用于每个目标VBox。大致如下:

this.byId(“grid”).getContent().forEach(函数(oVbox){
//需要从中获取HBox和第二个VBox。
oVbox.getItems()[0].getItems()[1].getBinding(“items”).filter(…);
});

此外,网格和VBox都有相同的ID,因此代码也会因此失败。通常,您不需要为聚合模板或子级定义ID。

为了本例的目的,ID/数据等都是由ID组成的。我已经做了你建议的修改,效果非常好!现在,如果网格元素的所有“VBox”项都已过滤,我希望能够“隐藏”网格元素。有什么想法吗?这取决于您是否真的使用JSON模型:)如果您使用JSON模型,那么一旦应用过滤器-->项目聚合将立即更新-->您可以在应用过滤器后立即检查项目聚合的长度(类似于
oVboxOuter.setVisible(oVboxInner.getItems().length>0)
)。如果您使用的是OData模型,则必须侦听绑定的data received事件(因为过滤实际上会触发一个请求;因此,当数据到达时,您将只知道您是否至少有一个项)。数据从SAP到达,但随后会合并到上面看到的JSON中。在应用程序的生命周期中,数据会被接收一次,并且不会再次接收。对不起,我应该早点说清楚。。。我的意思是,如果没有项,我希望能够过滤网格(这将“隐藏”它)。为了能够过滤网格,您需要在JSON模型中有要过滤的“东西”(即,要过滤的聚合属性)。我的建议是:当您在网格的每个
内容
元素上循环时,您可以获得内部VBox的
聚合的长度(如上所述),并将其存储在模型中新属性的相应结果条目中;(您可以从每个元素的绑定上下文中获取路径)。然后,您可以使用此属性过滤网格的聚合(每次在内容上循环之后,您都应该重新应用此过滤器)。我不确定是否完全理解。如果我过滤网格,那么其中将没有可过滤项目的项目,并且/itemsLength属性也不会重置。我正在做这个
grid.getBinding(“content”).filter(新过滤器(“itemsLength”,FilterOperator.GT,0))循环结束后,这是在循环中:
itemsBinding.filter(新过滤器(“filterVal”,FilterOperator.Contains,text))
那._view.getModel(“网格”).setProperty(path+“/itemsLength”,items.getItems().length)
  {
  "results": [{
          "text": "object1",
          "icon": "icon1",
          "data": [{
              "value1": "foo",
              "value2": "bar"
          }, {
              "value1": "john",
              "value2": "smith"
          }]
      },

      {
          "text": "object2",
          "icon": "icon2",
          "data": [{
              "value1": "adam",
              "value2": "bobson"
          }, {
              "value1": "john",
              "value2": "smith"
          }, {
              "value1": "whatever",
              "value2": "work please"
          }]
      }
  ]