2014-07-22 29 views
3

我將一個聚合綁定到一個表。我無法找到綁定完成後觸發的事件。 sap.m.List中有「updateFinished」事件,這正是我在Table(和dropodown)中查找的內容。我想在模型上使用attachRequestCompleted(),但是在其他地方我不想讓這個事件觸發。SAPUI5 bindAggregation已完成表

有沒有辦法在表格(和下拉列表)上完成數據綁定後觸發事件?

任何幫助表示讚賞。

在此先感謝。

更新:從ListBase擴展的表有「updateFinished」事件。在我發佈這個問題之前,我仍然不確定我是如何錯過的。但是,該問題對於下拉列表和TableSelectDialog控件仍然有效。

+0

只是出於好奇,你能詳細闡述一下附加到這種事件的用例嗎? – Qualiture

+0

您好Qualiture,我必須在下拉菜單中根據所選鍵顯示某些內容,其中所選鍵是從服務器綁定的。我只能在綁定完成時才能讀取值。我正在使用oData模型。 –

+0

在表格的情況下,可以說我想顯示一個'加載'消息,直到數據的實際加載完成。 –

回答

0

如果你想顯示你的表中的「加載」指標,而數據仍在加載(因而不綁定),我認爲最好的辦法是:

  1. 使用專用JSONModel其中只包含UI特定的內容,如切換控件的enabled/readonly/busy /等屬性。

    在你的情況,是這樣的:

    var oUIModelData = { 
        tableIsBusy  : false, 
        //etc, things like : 
        btnSubmitEnabled : false, 
        someControlVisible : true 
    }; 
    var oUIModel = new sap.ui.model.json.JSONModel(); 
    oUIModel.setData(oUIModelData); 
    sap.ui.getCore().setModel(oUIModel, "UIModel"); 
    
  2. 在你的表定義中,busy屬性綁定到{UIModel>/tableIsBusy}並設置表的屬性busyIndicatorDelay0避免延誤

  3. 你之前就做你的OData服務電話,設置屬性tableBusytrue。這將立即顯示忙覆蓋到表:

    sap.ui.getCore().getModel("UIModel").setProperty(tableIsBusy, true); 
    //here your OData read call 
    
  4. 在您的OData服務的requestCompleted(如果需要,也requestFailed)事件處理程序,設置UIModel繁忙的財產回false:

    sap.ui.getCore().getModel("UIModel").setProperty(tableIsBusy, false); 
    

這種方法的最大好處是(恕我直言)而不是依賴於每個控制來檢查數據是否已經被加載,只要做到這一點的實際負載時。 通過將這些UI相關的東西綁定到(單獨的)模型可以使您免於編寫大量額外的代碼;-)

0

通常,您可以通過對OData服務使用批處理來解決問題。根據https://sapui5.netweaver.ondemand.com/docs/guide/6c47b2b39db9404582994070ec3d57a2.html

  1. 使用OData模型v2。

    var oModel = new sap.ui.model.odata.v2.ODataModel(myServiceUrl); 
    
  2. 定義一組延遲批處理組。

    oModel.setDeferredBatchGroups(["myGroupId", "myGroupId2"]); 
    
  3. 批組信息添加到相應的綁定,例如:

    { 
        path:"/myEntities", 
        parameters: { 
        batchGroupId: "myGroupId" 
        } 
    } 
    
  4. 所有讀某批次組中的綁定/查詢的行動將受到阻礙,直到.submitChanges(.)電話上批次組製成。

    oModel.submitChanges({ 
        batchGroupId: "myGroupId", 
        success: mySuccessHandler, 
        error: myErrorHandler 
    }); 
    

使用成功/錯誤處理程序來執行動作。

這種相當通用的方法爲您提供了額外的控制,例如OData模型上的觸發器操作,分組和事件處理。

1

我也偶然發現了這個問題,但在另一個上下文中。 我有一個網格佈局,我通過oData模型動態加載面板。

因此,我在XML Grid-View元素中輸入了路徑。

<l:Grid id="grid" content="{some path...}">...</l:Grid> 

現在我想設置網格視圖繁忙,當數據加載恢復這一點。

因此我使用網格視圖的綁定。 在控制器OnInit方法我已經加入:

this._oGrid = this.getView().byId("grid"); 
this.getRouter().attachRouteMatched(this._onRouteMatch.bind(this)); 

請注意,綁定方法不可用在每一個瀏覽器。你需要應用一個polyfill。 (見https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

也結合無關與綁定:d

我需要做到這一點,因爲綁定並不是在OnInit功能可用。

的_onRouteMatched功能:

var oContent = this._oGrid.getBinding("content"); 
oContent.attachDataReceived(function(oData) { 
    this._oGrid.setBusy(false); 
}.bind(this)); 

現在,當數據被接收忙選項設置爲false。