Sapui5 navTo 在 ajax 语句中不起作用

Sapui5 navTo not working in ajax statement

我的页面中有一个表单。当用户单击按钮时,如果没有问题,此代码必须导航我的 Tile 页面。我正在处理这个问题:Uncaught TypeError: Cannot read property 'navTo' of undefined

这是我的代码:

 onPressGonder: function (evt) {
  var sURL = "xxxxxx";
  $.ajax({  
    url: sURL,  
    dataType: "json",
    success: function(data) {
      if (data.ResultCode === 7) {
        sap.m.MessageToast.show("Error:" +data.Alerts[0].Message+"") ; 
      } else {
        sap.m.MessageToast.show("Login succesfull.");
        sap.ui.core.UIComponent.getRouterFor(this).navTo("Tile");
      }   
    }
  }); 
}  

您遇到范围问题。作为成功回调提供的函数是稍后由 jQuery.ajax 调用的匿名函数。因此它不是您的控制器的方法,因此不知道 this。默认情况下(如在您的匿名函数中) this 指的是 window 对象。所以你基本上做的是:

sap.ui.core.UIComponent.getRouterFor(window).navTo("Tile");

window 对象显然没有路由器或 navTo 方法 ;) 最简单的解决方法是通过 closure 范围使 this 可用,如下所示:

onPressGonder: function (evt) {
  var sURL = "xxxxxx",
      that = this;
  $.ajax({  
    url: sURL,  
    dataType: "json",
    success: function(data) {
      if (data.ResultCode === 7) {
        sap.m.MessageToast.show("Error:" +data.Alerts[0].Message+"") ; 
      } else {
        sap.m.MessageToast.show("Login succesfull.");
        sap.ui.core.UIComponent.getRouterFor(that).navTo("Tile");
      }   
    }
  }); 
}

另一个可能更优雅的解决方案是使用 jQuery.ajaxcontext 属性。它将确保任何 ajax 回调将使用提供的上下文执行(这意味着您作为上下文传递的任何内容都将在回调中被称为 this):

  $.ajax({  
    ...
    success: function(data) {
      ...
      sap.ui.core.UIComponent.getRouterFor(this).navTo("Tile"); 
    },
    context: this
  });