在我的教程SAPUI5应用开发教程第64期-如何在基于SAPUI5的表格控件中实现过滤(filter)和排序(sort)ODataV4的函数中,有朋友提出了一个问题:代码第37行的FilterType.Application的作用是什么?这个FilterType.Application是枚举类型FilterType的字段,作为filter的入参之一。过滤器方法在ODataListBinding.prototype.filter上定义。该方法的实现源码可以在ODataListBinding.js文件中找到。在里面的大注释中,提到了这个FilterType的含义:也可以从官方文档查看这个FilterType的定义:每个listbinding维护两个独立的filterlist,一个为binding拥有的filterlist里面定义的filter控件(在ODataListBinding实例的aFilters数组属性中维护),另一个用于应用程序可以额外定义的过滤器列表(在ODataListBinding属性的aApplicationFilters数组属性中维护)。执行过滤操作时,合并两组过滤器。FilterType.Control可以理解为一个过滤器集合,由控件自己维护和实现。这些过滤逻辑是外部消费应用程序的黑盒。某些控件将筛选功能作为其行为的一部分,例如表列或分面筛选器。当此类控件为绑定路径定义过滤器时,它们应该使用FilterType.Control将它们的过滤器与应用程序可能以其他方式定义的过滤器分开。查看ODataListBinding的实现源码。如果过滤器类型为FilterType.Control,则在1768行将filter方法传入的过滤器详情放入this.aFilters数组属性中;否则,类型为FilterType.Application,此时定义的过滤器放在this.aApplicationFilters中。我们在search字段中输入Hu来过滤People模型的LastName字段:后两种类型的过滤器会在ODataListBinding.prototype.filter方法的调用栈中通过combineFilters进行合并操作:
