Sapui5 基于嵌套聚合绑定的过滤
我希望能够对嵌套聚合绑定应用过滤器,但它似乎不起作用。以下是XML: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
<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"
}]
}
]