Sapui5 navTo不在ajax语句中工作

时间:2015-03-26 06:34:32

标签: ajax sapui5

我的页面中有一个表单。当用户点击按钮时如果没有问题,此代码必须导航我的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");
      }   
    }
  }); 
}  

1 个答案:

答案 0 :(得分:0)

您遇到了范围问题。作为成功回调提供的函数是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
  });