DataReceived事件无法触发?

时间:2017-05-11 02:43:32

标签: sapui5

我正在使用SAPUI5实现Master-Detail应用程序,第一次打开应用程序时,URL哈希为空,我想将哈希值设置为主列表中的第一项,但是我无法将dataReceived事件触发到决定listLoading完成。任何的想法?

的manifest.json:

{
    "sap.app": {
        "dataSources": {
            "mainService": {
                "uri": "XXX",
                "type": "JSON"
            }
        },
        ...
}

Master.view.xml:

<List items="{path: '/'}">
        ...
</List>

Master.controller.js

onInit : function () {
    this.getRouter().getRoute("master").attachPatternMatched(this._onMasterMatched, this);
}
/**
* If the master route was hit (empty hash) we have to set
* the hash to to the first item in the list as soon as the
* listLoading is done and the first item in the list is known
* @private
*/
_onMasterMatched :  function() {
    console.log(this._oList.getBinding("items") instanceof sap.ui.model.Binding) // return ture
    this._oList.getBinding("items").attachEventOnce("dataReceived",
        function(oData) {
            //did not call 
            var oFirstListItem = this._oList.getItems()[0]; 
        });
}

参考:https://sapui5.hana.ondemand.com/#docs/api/symbols/sap.ui.model.Binding.html#event:dataReceived

2 个答案:

答案 0 :(得分:0)

从上面的代码我可以假设你有一个JSONModel,它是由Component通过app描述符(= manifest.json)创建的,所以我们谈论的是“自动”创建模型。 JSONModel成功加载数据我猜...但是,所有这些都发生在应用程序的早期阶段。换句话说,永远不会调用您的事件处理程序,因为数据已经加载并且在加载数据后附加事件处理程序意味着您可能过晚地附加了事件处理程序。

顺便说一句:我建议不要在 _onMasterMatched()中附加处理程序(每次),我建议直接使用 attachEvent在 onInit()中执行此操作()即可。这只是一个提示,它对你的情况没有帮助。

建议: 你在onInit()中的Master.controller.js里面的JSONModel中创建怎么样?然后,您可以在此处轻松附加事件处理程序。我甚至更喜欢这个,因为主列表的数据属于主视图/控制器,因此我不会将它放入应用程序描述符中。但由于我并不是真的意识到这些要求,我可能会错在这里......

答案 1 :(得分:0)

获得有关列表初始更新的通知的另一种方法是在 onInit 处理程序中使用updateFinished

onInit: function() {
  this.byId("list").attachEventOnce('updateFinished', this.onInitialUpdateFinished, this);
},

当列表“收到”并绑定数据时,将触发事件处理程序onInitialUpdateFinished