SAPUI5中的路由:如何实现URL的传递?未初始加载的模型数据

时间:2015-05-12 11:41:30

标签: url-routing sapui5

我的目标是编写具有路由支持的SAPUI5 Fiori应用程序。一个邮件目标是拥有可通过的URL。例如,在“请批准此:链接”的电子邮件中。 链接是我的rounting配置匹配的网址,例如index.html#/applicants/8

我使用典型的sap.m.SplitApp类应用程序。单击masterview中的列表项会将URL更改为index.html#/applicants/[id of entry in JSON]。我可以点击列表,我定义的路线匹配,应用程序按预期加载(申请人)数据。

但是,我的问题就是这个问题,直接使用网址,比如将[my url]/index.html#/applicants/8粘贴到我的浏览器中时,这个功能不起作用。该应用程序已启动,但未加载任何详细数据。我必须再次点击另一个列表项来获取数据。

实际上,在传递URL时会调用控制器,但似乎模型未启动且未定义。我的JSON模型绑定在createContent

Component.js函数中

//更新2015-05-14 问题似乎在getData()函数周围。我有模型,它有条目,但getData()在我的应用第一次加载时返回undefined。我最近阅读getData()已被弃用。我应该如何改进下面的编码?

// Component.js
ui5testing.Component.prototype.createContent = function(){
  // create root view
  var oView = sap.ui.view({
    id : "app",
    viewName : "ui5testing.view.Main",
    type : "JS",
    viewData : {
        component : this
    }
  var oModel = new sap.ui.model.json.JSONModel("model/mock_applicants.json");
  oView.setModel(oModel);
  [...]
  return oView;
});
// Master controller
handleApplicantSelect : function (evt) {
    var oHashChanger = sap.ui.core.routing.HashChanger.getInstance();
    var context  = evt.getParameter("listItem").getBindingContext();
    var path = context.getPath();
    var model = this.getView().getModel();
    var item =  model.getProperty(path);
    oHashChanger.setHash("applicants/" + item.id);
},

// Detail controller
onInit: function() {
    this.router = sap.ui.core.UIComponent.getRouterFor(this);
    this.router.attachRoutePatternMatched(this._handleRouteMatched, this);
},

_handleRouteMatched : function(evt){        
    var objectId = evt.getParameter("arguments").id;
    var model = this.getView().getModel();
    var data = model.getData()["applicants"];
    var pathId;

    if (data) {
        for (var i = 0; data.length; i++) {
            if ( objectId == data[i].id ) {
                pathId = i;
                break;
            }
        }

        var sPath = "/applicants/" + pathId;

        var context = new sap.ui.model.Context(model, sPath)
        this.getView().setBindingContext(context);              
    }
},

1 个答案:

答案 0 :(得分:4)

您已经发现getData()第一次返回undefined,这意味着模型数据仍未加载。因此,您可以使用模型&的attachRequestCompleted方法。发射组件中的事件&在详细控制器中监听该事件,以确保只在加载数据后才能执行routerPatternMatched()。

// Component.js

var oModel = new sap.ui.model.json.JSONModel("model/mock_applicants.json");

oModel.attachRequestCompleted(jQuery.proxy(function(){
   this.fireEvent("MockDataLoaded"); // fireEvent through component
},this));

oView.setModel(oModel);

//详情控制器

onInit : function(){

this.router = sap.ui.core.UIComponent.getRouterFor(this);  

var oComponent = this.getOwnerComponent();

oComponent.attachEvent("MockDataLoaded",jQuery.proxy(function(){
   this.router.attachRoutePatternMatched(this._handleRouteMatched, this);
},this));

}

或者最简单的&但脏的方法是发出同步请求而不是异步请求来加载数据。

var oModel = new sap.ui.model.json.JSONModel();

oModel.loadData(""model/mock_applicants.json",{bAsync:false});

oView.setModel(oModel);