SAPUI5 - 每次显示视图时调用哪种方法?

时间:2014-02-22 23:06:23

标签: sapui5

我希望在每次显示视图之前做一些逻辑。我不能在渲染方法之前使用它,因为它只在创建视图时被调用一次并显示为第一次。帮助。任何想法?< / p>

5 个答案:

答案 0 :(得分:10)

为什么你认为控件的before渲染方法只被调用一次?你有任何示例代码吗?

我在jsbin(http://jsbin.com/qikokayo/1/edit?html,output)上创建了一个快速的脏例子供你查看。它清楚地表明,onInit被调用一次,但每次调用onBeforeRendering ......

另请参阅此代码段from the OpenUI5 SDK,其中解释了:

  

生命周期钩子

     

onInit() - 在实例化View及其控件时调用(如果   已创建。可以用来修改View之前   它显示为绑定事件处理程序并执行其他一次性操作   初始化。

     

onExit() - 在视图被销毁时调用。使用这个免费   资源和最终活动。

     

onAfterRendering() - 在渲染视图时调用(因此   它的HTML是文档的一部分)。后期渲染操作   HTML可以在这里完成。此挂钩与SAPUI5控制的挂钩相同   被渲染后获得。

     

onBeforeRendering() - 在Controller的View之前调用   重新呈现。你应该在钩子的情况下使用onInit()   仅在第一次渲染之前调用。

     

对于没有View的控制器,不会调用生命周期挂钩。

答案 1 :(得分:5)

对于涉及Component和关联routing的现代SAPUI5 fiori样式应用程序,您始终可以在视图中附加一个方法,只要与提供的路径模式匹配,就会调用该方法视图。此路线历来在metadata类的Component中提供,但自v1.30文件中声明manifest.json以来。

在视图的onInit方法中,您可以执行以下操作:

onInit: function() {
    this._oRouter = this.getOwnerComponent().getRouter();
    this._oRouter.getRoute("yourRouteForThisView").attachPatternMatched(this._onObjectMatched, this);
}

因此,每次进入视图时都会调用_onObjectMatched方法。在这里,您可以将所有代码放在此处,以便在渲染视图之前执行。

_onObjectMatched: function(oEvent) {
    var oArgs = oEvent.getParameter("arguments");
    //If any values were passed in the URL then those will be available in oArgs
    //Do other stuff here
}

您也可以将此用于着陆页。第一个视图通常在""中有一个空字符串manifest作为其路由模式。

答案 2 :(得分:4)

另一种模式如下(感谢Matbtt)

onInit : function () {

    //...other code

    var router = this.getOwnerComponent().getRouter();
    var target = router.getTarget("<your route target name>");
    target.attachDisplay(this.onDisplay, this);
},

/** Fires evey time view is displayed.
 *
 * @param oEvent
 */
onDisplay: function(oEvent) {

    console.log('refreshData')
    this._refreshData()
},      

每次显示视图时都会触发onDisplay函数。在我自己的小经验中,渲染事件比最初假设的更频繁地被触发。

答案 3 :(得分:3)

我已经解决了onBeforeShow的问题。感谢jason的努力。

答案 4 :(得分:1)

我可以给你一个答案,但只与UI5中的旧导航方法有关。但也许你也把它当作一个起点并且和我有同样的问题。

这里是一个带有控制器的JSBin,用于处理从Master到Detail视图的导航 - &gt; http://jsbin.com/xomuvi/2/edit

在那里你可以看到电话:

page.rerender();

它再次触发onBeforeRendering和onAfterRendering事件。

但是第一次调用to会触发事件两次,请注意这一点。