2015-02-24 118 views

回答

13

你是絕對正確的。控件生命週期和實現細節的細節很好地隱藏在文檔中。我會盡力總結我對你的理解。

  • init

    控件的生命週期主要是由確定你的小控制誕生了!函數在構造函數執行期間由框架調用。在這裏做你的初始化東西。

  • onBeforeRendering:在控件的呈現開始之前由框架調用。在每次(重新)渲染之前觸發。
  • onAfterRendering:在控件呈現完成後由框架調用。每次(重新)呈現後觸發。
  • exit:RIP小控制!在銷燬之前清理元素實例。由框架調用。在這裏做你的清理。順便說一句:如果你需要明確地破壞一個控制/元素,你應該調用destroy而不是直接退出。

下面是一個簡單的實現與不同的鉤子的用法示例:

sap.ui.core.Control.extend("a.sample.Control", { 
    init : function() { 
    // instantiate a sub-control 
    this._btn = new sap.m.Button(); 
    }, 

    onBeforeRendering : function() { 
    // deregister a listener via jQuery 
    this.$("subelement").off("click", this.subElementClick); 
    }, 

    onAfterRendering : function() { 
    // register a listener via jQuery on a sub-element 
    this.$("subelement").on("click", this.subElementClick); 
    }, 

    subElementClick : function() { 
    // do stuff 
    }, 

    exit : function() { 
    // clean up sub-controls and local references 
    this._btn.destroy(); 
    delete this._btn; 
    } 

}); 

爲什麼不應該我做我的初始化的東西在我的構造函數?

ManagedObject中有一個基本的UI5構造函數。它爲你準備好你的UI5對象,然後調用你的init函數。這意味着在你的init中,所有的設置都已經適用於你,你可以照常訪問屬性和聚合。

爲什麼我不應該叫退縮?

從某種意義上講,SAPUI5渲染非常智能,因爲它可以對排隊的重新排列進行分組和優化。因此,你不應該直接調用rerender,而應該使用invalidate來標記控制重新渲染。

HF

克里斯

1

SAPUI5提供預定義的生命週期掛鉤的實現。您可以將事件處理程序或其他功能添加到控制器,並且控制器可以觸發其他控制器或實體可以註冊的事件。

SAPUI5提供了以下的生命週期鉤:

的OnInit():當一個視圖被實例化並調用它的控制(如果可用)已經創建;用於在顯示之前修改視圖以綁定事件處理程序並執行其他一次性初始化操作

onExit():在視圖被銷燬時調用;用於釋放資源並完成活動

onAfterRendering():調用視圖已被渲染時,因此它的HTML是文檔的一部分;用於執行HTML的後處理操作。 SAPUI5控件在呈現後獲取該鉤子。

onBeforeRendering():在控制器視圖重新呈現之前調用,而不是在第一次呈現之前調用;使用onInit()在第一次渲染之前調用掛鉤

+0

只是爲了區分:問題是關於控制而不是控制器。控件既不提供'onInit'也不提供'onExit'。儘管不是控件,Controller中的生命週期鉤子仍然可以工作,因爲處理程序只是[附加](https://github.com/SAP/openui5/blob/rel-1.48.5/src/sap.ui.core/src /sap/ui/core/mvc/Controller.js#L329)添加到[生命週期事件](https://sapui5.hana.ondemand.com/docs/api/symbols/sap.ui.core.mvc.View。 html#event:afterInit)的相應視圖,這反過來又是一個控件。 – boghyon 2017-08-30 13:03:51