我想在每次显示视图之前做一些逻辑。我不能在渲染方法之前使用,因为它在第一次创建和显示视图时只调用一次。请帮助。有什么想法吗?
4 回答
为什么你认为控件的渲染前方法只被调用一次?你有任何示例代码吗?
我在 jsbin ( http://jsbin.com/qikokayo/1/edit?html,output ) 上创建了一个快速的肮脏示例供您查看。它清楚地表明onInit
被调用一次但onBeforeRendering
每次都被调用......
另请参阅OpenUI5 SDK 中的此代码段,其中解释了:
生命周期挂钩
onInit()
- 当视图被实例化并且它的控件(如果可用)已经创建时调用。可用于在视图显示之前对其进行修改,以绑定事件处理程序并进行其他一次性初始化。
onExit()
- 当视图被销毁时调用。使用这个来释放资源并完成活动。
onAfterRendering()
- 当视图被渲染时调用(因此它的 HTML 是文档的一部分)。可以在此处完成 HTML 的渲染后操作。这个钩子和 SAPUI5 控件在渲染后得到的钩子是一样的。
onBeforeRendering()
- 在重新渲染控制器的视图之前调用。如果仅在第一次渲染之前调用钩子,您将使用 onInit()。对于没有视图的控制器,不会调用生命周期钩子。
对于现代 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
.
另一种模式如下(感谢 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 函数。在我自己的小经验中,渲染事件的触发频率比最初假设的要高。
我已经用onBeforeShow
.Thanks 解决了这个问题。感谢 jason 的努力。