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

Why attachPatternMatched not working in first load if it is put in onAfterRendering?

我在我的 UI5 应用程序中使用 echarts,所以我需要等待 dom 准备好然后执行 _onObjectMatched,但在第一次加载时,会触发 _onObjectMatched如果我把它放在 onInit 中,但它在 onAfterRendering 中不起作用。我在onAfterRendering里面放了一个log,所以我很确定onAfterRendering被执行了,后面调用_onObjectMatched就OK了。顺便说一句,我正在构建主从页面。

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);
},

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

如果你的echart还没有准备好,我建议在onInit()中附加你的处理程序并将路由信息保存在控制器中。 在您的 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;
}