我希望在每次显示视图之前做一些逻辑。我不能在渲染方法之前使用它,因为它只在创建视图时被调用一次并显示为第一次。帮助。任何想法?< / p>
答案 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
会触发事件两次,请注意这一点。