为什么attachPatternMatched在第一次加载时不工作,如果它放在onAfterRendering中?

时间:2016-11-12 00:29:24

标签: sapui5 sap-fiori

我在我的UI5应用中使用echarts,所以我需要等待dom然后执行_onObjectMatched,但是在第一次加载时,如果我将其放入_onObjectMatched,则会触发onInit {1}},但它在onAfterRendering中无效。我把一个登录onAfterRendering,所以我很确定onAfterRendering被执行,后来调用_onObjectMatched就行了。顺便说一句,我正在建立一个Master-Detail页面。

onInit : function () {
   this.getRouter().getRoute("object").attachPatternMatched(this._onObjectMatched, this);
}

onAfterRendering: function () {
   this.getRouter().getRoute("object").attachPatternMatched(this._onObjectMatched, this);
}

getRouter : function () {
    return sap.ui.core.UIComponent.getRouterFor(this);
},

1 个答案:

答案 0 :(得分:2)

路线在onInit()之后但在onAfterRendering()之前匹配。因此,如果您在onAfterRendering()附加了您的事件处理程序,那么您就太迟了并且错过了该事件。

我建议在onInit()中附加您的处理程序,如果您的echart没有准备就将路由信息保存在控制器中。 在初始化echart之后使用该信息来更新视图。

onAfterRendering:function(){
  //init charts
  this._chartReady = true;
  this._updateViewFromRoute();
},
onBeforeRendering:function(){
  this._chartReady = false;
},
_onObjectMatched:function(oEvent){
  //Save Args
  this._routerArgs = oEvent.getParameter("arguments");
  this._updateViewFromRoute();
},
_updateViewFromRoute:function(){
  if(!this._chartReady) return;
  if(!this._routerArgs) return;
  //do something with this._routerArgs
  this._routerArgs = null;
}