ODataListBinding.filter 方法裡 FilterType.Application 和 Control 的區別

JerryWang_汪子熙 發表於 2022-06-20

在我的這篇教程 SAP UI5 應用開發教程之六十四 - 基於 OData V4 的 SAP UI5 表格控制元件如何實現 filter(過濾) 和 sort(排序)功能 裡,有朋友提出了一個疑問:

程式碼第 37 行裡這個 FilterType.Application 的作用是什麼?

ODataListBinding.filter 方法裡 FilterType.Application 和 Control 的區別

這個 FilterType.Application 是列舉型別 FilterType 的一個欄位,作為 filter 的輸入引數之一。filter 方法定義在 ODataListBinding.prototype.filter 上。

ODataListBinding.js 檔案裡能找到這個方法的實現原始碼。

ODataListBinding.filter 方法裡 FilterType.Application 和 Control 的區別

裡面的大段註釋裡,就提到了這個 FilterType 的含義:

ODataListBinding.filter 方法裡 FilterType.Application 和 Control 的區別

也可以從官方文件裡檢視這個 FilterType 的定義:

每個列表繫結維護兩個單獨的過濾器列表,一個用於由擁有該繫結的控制元件內部定義的過濾器(維護在 ODataListBinding 例項的 aFilters 陣列屬性裡),另一個用於應用程式可以另外定義的過濾器列表(維護在 ODataListBinding 屬性的 aApplicationFilters 陣列屬性裡)。 當執行過濾操作時,兩組過濾器會被合併。

ODataListBinding.filter 方法裡 FilterType.Application 和 Control 的區別

可以把 FilterType.Control 理解成由控制元件本身設定、維護並實現的過濾器,這些過濾邏輯對於外界消費的應用程式來說是一個黑盒子。某些控制元件將過濾器功能作為其行為的一部分,例如 Table ColumnsFacet filters 過濾器。 當此類控制元件為某繫結路徑定義過濾器時,它們應使用 FilterType.Control 將其過濾器與應用程式可能另外定義的過濾器分開。

ODataListBinding.filter 方法裡 FilterType.Application 和 Control 的區別

檢視 ODataListBinding 的實現原始碼,如果過濾器型別為 FilterType.Control,就把 filter 方法傳入的過濾器明細放置到 1768 行的 this.aFilters 陣列屬性裡;

否則型別就是 FilterType.Application, 此時過濾器定義放置到 this.aApplicationFilters 裡。

ODataListBinding.filter 方法裡 FilterType.Application 和 Control 的區別

ODataListBinding.filter 方法裡 FilterType.Application 和 Control 的區別

我們在 search 欄位輸入 Hu,對 People 模型的 LastName 欄位進行過濾:

ODataListBinding.filter 方法裡 FilterType.Application 和 Control 的區別

最後這兩種型別的 filter,會在 ODataListBinding.prototype.filter 方法的呼叫棧內部,通過 combineFilters 做一個合併操作:

ODataListBinding.filter 方法裡 FilterType.Application 和 Control 的區別