为什么metadataLoaded可以被多次触发?

时间:2017-06-21 08:01:53

标签: javascript sapui5

相关问题:What is the replacement for metadataLoaded in JSON model?

当我在sap.ui.model.odata.v2.ODataModel中使用metadataLoaded时,每次调用_onObjectMatched时,metadataLoaded也会被触发。

this.getRouter().getRoute("object").attachPatternMatched(this._onObjectMatched, this);

            _onObjectMatched : function (oEvent) {
                var sObjectId =  oEvent.getParameter("arguments").objectId;
                this.getModel().metadataLoaded().then( function() {
                    //fired every time
                    this._bindView(sObjectId);
                }.bind(this));
            },

但是当我在RequestCompleted中使用sap.ui.model.json.JSONModel时,RequestCompleted仅在加载请求数据时触发一次。

this.getModel().attachRequestCompleted(function() {
    //fired only once 
    this._bindView(sObjectId);
});

我很好奇为什么?我认为元数据也应该只加载一次?

更新

console

实际上,我已经发现metadataLoaded返回一个promise(我应该知道当我看到then()时),但就像@Nabi指出的那样,我对promise不熟悉。在我提出这个问题之前,我应该深入挖掘。

这两个问题的目的是在JSON模型中找到metadataLoaded的优雅和官方替代品,我应该将它们合并还是......

1 个答案:

答案 0 :(得分:1)

每次路线匹配时都会调用

_onObjectMatched()。在那里,您总是调用this.getModel().metadataLoaded().then(...),而metadataLoadad()返回一个在加载元数据时(过去或将来)解析的承诺。每次都会发生这种情况,因为每次都会调用this.getModel().metadataLoaded().then(...)

看看Promises可能是个好主意,我相信你会明白这个想法。事实上,请确保您了解事件和承诺之间的区别......