Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SAPUI5每次显示视图时调用哪个方法?_Sapui5 - Fatal编程技术网

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

SAPUI5每次显示视图时调用哪个方法?,sapui5,Sapui5,我想在每次显示视图之前进行一些逻辑操作。我不能使用before rendering方法,因为在首次创建和显示视图时只调用一次before rendering方法。请提供帮助。有什么想法吗?为什么您认为控件的before rendering方法只调用一次?您有任何示例代码吗 我在jsbin()上创建了一个快速的脏示例,供您查看。它清楚地表明,onInit只调用了一次,但每次调用onbeforeredering 另请参见此片段,其中解释: 生命周期挂钩 onInit()-在实例化视图及其控件时调用(

我想在每次显示视图之前进行一些逻辑操作。我不能使用before rendering方法,因为在首次创建和显示视图时只调用一次before rendering方法。请提供帮助。有什么想法吗?

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

我在jsbin()上创建了一个快速的脏示例,供您查看。它清楚地表明,
onInit
只调用了一次,但每次调用
onbeforeredering

另请参见此片段,其中解释:

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

onExit()
-在视图被销毁时调用。用这个来释放 资源和最后确定活动

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

_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
}
onBeforeRendering()
-在控制器视图打开之前调用 重新渲染。如果钩子应该是 仅在第一次渲染之前调用

对于没有视图的控制器,将不调用生命周期挂钩


我已经解决了在BeforeShow上出现的问题。感谢jason的努力。

对于包含
组件和相关
路由的现代SAPUI5 fiori样式应用程序,您可以始终将一个方法附加到视图,只要该视图与提供的路由模式匹配,就会调用该方法。该路由历史上是在
组件
类的
元数据
中提供的,但自从
v1.30以来,它在
manifest.json
文件中声明

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

onInit: function() {
    this._oRouter = this.getOwnerComponent().getRouter();
    this._oRouter.getRoute("yourRouteForThisView").attachPatternMatched(this._onObjectMatched, this);
}
因此,您有了对象匹配的
\u 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
}

您也可以将其用于登录页。第一个视图通常有一个空字符串
作为其在
清单中的路由模式
另一个模式如下(感谢Matbtt)

onInit:function(){
//…其他代码
var router=this.getOwnerComponent().getRouter();
var target=router.getTarget(“”);
target.attachDisplay(this.onDisplay,this);
},
/**显示“每个时间”视图时激发。
*
*@param oEvent
*/
onDisplay:功能(oEvent){
console.log('refreshData')
这个._refreshData()
},      

每次显示视图时都会触发onDisplay功能。在我自己的小经验中,渲染事件被触发的频率比人们最初想象的要高

您好,我使用的是基于mvc的拆分应用程序。因此,当您第一次添加详细信息页面时,会调用before rendering方法。但当我们下次通过toDetail调用详细信息页面时,则不会调用该方法。我已经尝试过了。单词“re rendered”在onBeforeRendering中,定义让我感到困惑…它似乎在视图的第一次渲染之前以及在重新渲染时被调用,而不仅仅是在视图重新渲染时。jsbin显示在加载第一页时调用onBeforeRendering:。。。我遗漏了什么吗?>我已经创建了一个快速[…]它清楚地表明,
onbeforeredering
每次都被调用。。当然,每次告诉框架重新加载时,您都会调用
invalidate()
,顺便说一句,这不是一个公共方法。请不要鼓励读者使用非公共方法。对于这种情况,我也会使用
onBeforeShow
。您可以看到我关于onBeforeShow的答案。@Papu请接受这个答案,以帮助未来的读者。当前接受的答案有许多缺陷(过时,建议使用非公开方法,强制视图重新渲染)。当前接受的答案误导性地建议将
onBefore/AfterRendering
作为一种解决方案,在这种情况下,这是一种反模式(如果不每次调用
invalidate()
,再加上,
invalidate(),它将无法工作)
甚至不是公共方法)。看见