在我的這篇教程 SAP UI5 應用開發教程之六十四 - 基於 OData V4 的 SAP UI5 表格控制元件如何實現 filter(過濾) 和 sort(排序)功能 裡,有朋友提出了一個疑問:
程式碼第 37 行裡這個 FilterType.Application
的作用是什麼?
這個 FilterType.Application 是列舉型別 FilterType
的一個欄位,作為 filter 的輸入引數之一。filter 方法定義在 ODataListBinding.prototype.filter
上。
從 ODataListBinding.js
檔案裡能找到這個方法的實現原始碼。
裡面的大段註釋裡,就提到了這個 FilterType 的含義:
也可以從官方文件裡檢視這個 FilterType 的定義:
每個列表繫結維護兩個單獨的過濾器列表,一個用於由擁有該繫結的控制元件內部定義的過濾器(維護在 ODataListBinding 例項的 aFilters
陣列屬性裡),另一個用於應用程式可以另外定義的過濾器列表(維護在 ODataListBinding 屬性的 aApplicationFilters
陣列屬性裡)。 當執行過濾操作時,兩組過濾器會被合併。
可以把 FilterType.Control 理解成由控制元件本身設定、維護並實現的過濾器,這些過濾邏輯對於外界消費的應用程式來說是一個黑盒子。某些控制元件將過濾器功能作為其行為的一部分,例如 Table Columns
或 Facet filters
過濾器。 當此類控制元件為某繫結路徑定義過濾器時,它們應使用 FilterType.Control
將其過濾器與應用程式可能另外定義的過濾器分開。
檢視 ODataListBinding
的實現原始碼,如果過濾器型別為 FilterType.Control,就把 filter 方法傳入的過濾器明細放置到 1768 行的 this.aFilters 陣列屬性裡;
否則型別就是 FilterType.Application, 此時過濾器定義放置到 this.aApplicationFilters
裡。
我們在 search 欄位輸入 Hu
,對 People 模型的 LastName 欄位進行過濾:
最後這兩種型別的 filter,會在 ODataListBinding.prototype.filter 方法的呼叫棧內部,通過 combineFilters
做一個合併操作: