關於 SAP UI5 OData V4 模型的 refresh 方法

注销發表於2022-05-24

SAP UI5 OData V4 模型包括下列三種繫結例項:

  • List Binding
  • Context Binding
  • Property Binding

無論哪種型別的資料繫結例項,其建立的資料服務請求,這些繫結例項都會設計一個快取,來儲存資料服務響應的資料。 如果可以從此快取中提供資料,這些繫結例項不會再次傳送資料服務請求。

應用開發人員可以使用 refresh 方法刪除絕對繫結的快取。 該方法還刪除了絕對繫結的子繫結的快取。

呼叫重新整理方法時,繫結及其子繫結不得有待處理的屬性更改,即所謂的 pending property changes.

在刪除快取之前,使用繫結的 hasPendingChanges 方法檢查是否存在這種型別的更改。

一個例子:

onRefreshSelectedSalesOrder : function () {
    // within a sap.m.Table bound to a OData V4 list binding get the OData V4 context for the selected entity
    var oSalesOrderContext = this.byId("SalesOrders").getSelectedItem().getBindingContext();
      
    if (!oSalesOrderContext.hasPendingChanges()) {
        oSalesOrderContext.refresh();
    }
},

更新一個 entity 後,它可能不再匹配載入實體的集合的 query 選項,特別是 $filter。 您可以決定重新整理列表繫結的上下文是否應忽略查詢選項:透過將引數 bAllowRemoval 設定為 true,可以從集合的列表繫結中刪除相應的上下文。

需要注意的是,對列表的更改(如不同的排序順序)需要重新整理整個列表。

下面是一個例子。這個應用裡的 Table 控制元件,應用了一個過濾器,以僅顯示生命週期狀態為 New 的銷售訂單。確認銷售訂單時,其狀態將更改為 In Process,不再匹配過濾器。 此銷售訂單隨後會被重新整理,並將在 bAllowRemoval 標誌設定為 true 時,從列表中刪除。

上述邏輯的程式碼如下:

oAction.execute("confirmSalesOrderActionGroup").then(function () {
    oConfirmedSalesOrderContext.refresh(undefined, true); // bAllowRemoval = true
});

在 XML 檢視裡使用絕對路徑繫結,並且指定額外 query option 的例子:

<Table items="{
 path : '/SalesOrderList',
 parameters : {
  $expand : 'SO_2_BP',
  $select : 'BuyerName,CurrencyCode,GrossAmount,Note,SalesOrderID'
 }}">
 ...
 <items>  
  <ColumnListItem>
   <cells> 
    <Text text="{SalesOrderID}"/> 
    <Text text="{SO_2_BP/CompanyName}"/>
    <Text text="{BillingStatus}"/> 
   </cells>
  </ColumnListItem>

 </items>
</Table>

<Table items="{
 path : 'SO_2_SOITEM',
 parameters : {
    $select: "DeliveryDate,GrossAmount,SalesOrderID"
 }
>
...
</Table>

上面的示例顯示了一個絕對列表繫結:使用 $expand 和 $select 查詢選項作為繫結引數將表的專案聚合繫結到 /SalesOrderList。 這些列使用路徑 SalesOrderID、SO_2_BP/CompanyName 和 BillingStatus 定義相對繫結,並將絕對列表繫結作為父繫結。

上圖 XML 檢視裡第二個 table 控制元件,即顯示行專案的表格控制元件,使用相對繫結的語法。 由於它定義了引數,一旦它接收到它的繫結上下文,它就會觸發它自己的資料服務請求。

相關文章