首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SAPUI5 5/OpenUI5 5: attachRequestCompleted onInit函数模型

SAPUI5 5/OpenUI5 5: attachRequestCompleted onInit函数模型
EN

Stack Overflow用户
提问于 2016-02-04 13:22:30
回答 1查看 9.4K关注 0票数 1

我在我的Component.js中定义了两个模型。一个是所有联系人的列表,另一个是登录的联系人。现在,我想签入我的控制器,如果登录联系人已经存在于所有联系人的列表中。我将列表中的registrationToken与登录联系人中的令牌进行比较。但是当我循环遍历列表时,由于异步通信,长度是0。我看到了attachRequestCompleted函数,但现在我遇到了另一个问题.当我的附加函数填充我的视图-模型时,onInit-函数已经完成。

代码语言:javascript
运行
复制
onInit : function(){
    var gLocalContact = sap.ui.getCore().getModel("gLocalContact");
    var gRemoteContacts = sap.ui.getCore().getModel("gRemoteContacts");

    gRemoteContacts.attachRequestCompleted( function() {
        ... if ... setProperty to gLocalContact.getProperty("/registrationToken")...
        console.log("I should be the first log to get the data in view");
    });

    console.log("I should be the second log!");
    this.getView().setModel(gLocalContact, "localContact");
}

附件函数中的第一个日志应该是第一个,因为在那里,我为gLocalContact定义了一些数据,我认为这是我所需要的。另一个问题是我无法访问我的gLocalContact变量.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-04 22:39:11

这有点难看,因为SAPUI5不支持承诺。因此,在您的视图中,您不知道requestCompleted事件是否会被触发,或者数据是否已经加载。我想到了一些解决办法:

  1. 在调用requestCompleted ()之前,将loadData均衡器附加到组件中。然后,你可以放心,你将得到的事件。不过,您必须构建视图来处理空的gLocalContact模型。但是,一旦模型填充了数据,绑定就会更新视图。
  2. 把你的onInit()剩下的东西放进你的晚餐。要确保得到该事件,请检查您的模型中是否已经有数据,如果是这样的话,请手动调用您的均衡器,让它至少运行一次。
  3. 使用jQuerys承诺进行同步。这也允许您等待第二种模式:
代码语言:javascript
运行
复制
onInit : function(){
  var gLocalContact = sap.ui.getCore().getModel("gLocalContact");
  var gRemoteContacts = sap.ui.getCore().getModel("gRemoteContacts");

  console.log("Wait some seconds for the data...");
  var localContactPromise = this.getPromise(gLocalContact, "/origin");
  localContactPromise.done(function() {
    //same code as before but this time you can be shure its called.
    //... if ... setProperty to
    //gLocalContact.getProperty("/registrationToken")...
    console.log("I should be the first log to get the data in view");
  });

  var remoteContactsPromise = this.getPromise(gRemoteContacts,"/origin"); //Wait for the other model to
  $.when(localContactPromise, remoteContactsPromise).done(function(){ 
    //When both models are loaded do this
    console.log("I should be the second log!");
    this.getView().setModel(gLocalContact, "localContact");
    this.byId("label").setText("all loaded");
  }.bind(this));
},
getPromise:function(oModel, pathToTestForData){
  var deferred = $.Deferred();
  if (oModel.getProperty(pathToTestForData))
    deferred.resolve(); //Data already loaded
  else
    oModel.attachRequestCompleted(deferred.resolve); //Waiting for the event

  return deferred.promise();
}

JSBin上的实例

Promise是一个具有已完成事件的对象。Deferred是一个具有Promiseresolve()方法的对象,它将根据承诺引发已完成的事件。如果您首先在延迟上调用resolve(),然后为done注册一个处理程序,则会立即调用该处理程序。因此,即使您比异步加载请求慢,也不会错过该事件。

但是:如果当您的视图初始化时,您的模型甚至无法在组件/核心上设置,那么您就有一个严重的问题,因为不存在modelChanged事件。我建议创建一个空模型,并将其分配给组件init方法中的组件,然后在该模型上使用loadData()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35202170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档