10

我想在每次显示视图之前做一些逻辑。我不能在渲染方法之前使用,因为它在第一次创建和显示视图时只调用一次。请帮助。有什么想法吗?

4

4 回答 4

12

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

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

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

生命周期挂钩

onInit()- 当视图被实例化并且它的控件(如果可用)已经创建时调用。可用于在视图显示之前对其进行修改,以绑定事件处理程序并进行其他一次性初始化。

onExit()- 当视图被销毁时调用。使用这个来释放资源并完成活动。

onAfterRendering()- 当视图被渲染时调用(因此它的 HTML 是文档的一部分)。可以在此处完成 HTML 的渲染后操作。这个钩子和 SAPUI5 控件在渲染后得到的钩子是一样的。

onBeforeRendering()- 在重新渲染控制器的视图之前调用。如果仅在第一次渲染之前调用钩子,您将使用 onInit()。

对于没有视图的控制器,不会调用生命周期钩子。

于 2014-02-23T07:59:13.960 回答
6

对于现代 SAPUI5 fiori 样式的应用程序,涉及 aComponent和关联routing,您始终可以将一个方法附加到您的视图,只要与为该视图提供的路由模式匹配,就会调用该方法。这条路线历史上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.

于 2016-10-10T11:45:33.747 回答
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 函数。在我自己的小经验中,渲染事件的触发频率比最初假设的要高。

于 2016-11-12T11:51:02.650 回答
3

我已经用onBeforeShow.Thanks 解决了这个问题。感谢 jason 的努力。

于 2014-02-23T17:37:04.343 回答