什么时候bindElement会调用真正的服务?

时间:2017-11-22 07:51:17

标签: sapui5

Main.view.xml:

<ObjectHeader
    id="objectHeader"
    title="{name}"
    intro="{id}">
    <headerContainer>
        <IconTabBar
            id="tabBar"
            items="{
                path: 'assigned',
                parameters: {expand: 'b, c'} 
            }"
            select="onTabBarSelect">
        </IconTabBar>       
    </headerContainer>
</ObjectHeader>

Main.controller.js

onMasterSelectionChange : function (sPath) {
    var oSource = oEvent.getParameter("listItem") || oEvent.getSource(),
    // sPath = "/ASet('d')"
    sPath = oSource.getBindingContext().getPath(),
    oObjectHeader = this.byId("objectHeader");

    oObjectHeader.bindElement(sPath);
    this._oModel.attachEventOnce("requestCompleted", function(oEvent) {
        var oTabBar =  this.byId("TabBar");
        oFirstListItem = oTabBar.getItems()[0],
        sObjectId = oFirstListItem.getBindingContext().getProperty("id"),
        sDPath = "/DSet('" + sObjectId + "')";

        this._getControls(sDPath);
    }, this);
}

我发现了一个奇怪的行为:当我更改主列表选择时,有时网络会显示&#34; / ASet /已分配&#34;呼叫,但有时会没有呼叫,导致requestCompleted没有被解雇。

根据:SAPUI5 - bindElement doesn't work the second time

  

如果您使用相同路径两次调用bindElement,则第二次实际上不会触发新调用以获取新数据,因为路径没有变化。

但我相信这是不同的道路。有什么办法可以触发这个电话吗?

顺便说一句

oObjectHeader.bindElement({
    path : sPath,
    events: {
        change : function (oData, test) {
        },
        dataRequested : function (oData) {
        },
        dataReceived: function (oData) {
        }
    }
});
每次单击主列表时都会触发

change,但永远不会调用dataRequesteddataReceived

4 个答案:

答案 0 :(得分:1)

我知道这是一篇过时的文章,但实际上您可以通过刷新其bindElement事件中的绑定来触发change的网络调用。

this.getView().bindElement({
    path: "model>/" + sContextPath,
    events: {
        change: function (oEvent) {
            // Get the context binding object
            var oContextBinding = oEvent.getSource();

            // Refresh the binding.
            // This triggers a network call.
            oContextBinding.refresh(false);
        }.bind(this)
    }
});

刷新绑定会触发网络呼叫。另外,将bForceUpdate的{​​{1}}标志设置为refresh,以便仅在APIs中提到的数据发生变化的情况下才更新UI。 / p>

答案 1 :(得分:0)

如果你的ODataModel已经加载sPath下的数据(签入myODataModel.oData),它将不会再次加载该数据。因此,dataRequested / dataReceived不会触发。

但无论数据是否存在,只要路径发生变化,change就会触发。

答案 2 :(得分:0)

通过bindElement&amp; change替换oModel.read,我找到了解决办法......

onMasterSelectionChange : function (sPath) {
    var oSource = oEvent.getParameter("listItem") || oEvent.getSource(),
    // sPath = "/ASet('d')"
    sPath = oSource.getBindingContext().getPath(),
    oObjectHeader = this.byId("objectHeader");

    oObjectHeader.bindElement({
        path : sPath,
        events: {
            change : this._onBindingChange.bind(this, sPath)
        }
    })
},

_onBindingChange : function(sPath) {
    this._oModel.read(sPath + "/assigned", {
        urlParameters: {
            "$expand": "b, c"
        },
        success: function(oData) {
            var aAssigmentSet = oData.results,
            oViewModel = this.getModel("viewModel"),
            oTabBar =  this.byId("hazardTabBar");

            oViewModel.setProperty("/aAssigmentSet", aAssigmentSet);
            oTabBar.bindAggregation("items",
                "viewModel>/aAssigmentSet",
                new sap.m.IconTabFilter({
                    key: "{viewModel>id}",
                    tooltip : "{viewModel>id}",
                    text : {
                        parts: [{path: "viewModel>b/name"},
                        {path: "viewModel>c/type"}],
                        formatter : function(name, type) {
                            var sType = type.split(".");
                            return name + " (" + sType[sType.length - 1] + ")"; 
                        }
                    }
                })
            );

            if (oTabBar.getItems().length > 0) {
                var sSelectedTabKey;
                    sSelectedTabKey = oTabBar.getItems()[0].getKey();
                    oTabBar.fireSelect({selectedKey: sSelectedTabKey});
            }
        }.bind(this),
        error: this.errorCallback.bind(this)
    });
},

onTabBarSelect : function(oEvent) {
    var sRiskAssignmentPath = "/AssignmentSet('" + oEvent.getParameter("selectedKey") + "')";

    this._oModel.read(AssignmentSet + "/assignedAssignedControls", {
        ...
    }); 
}

答案 3 :(得分:0)

我认为实现此目标的正确方法是使用invalidate-Method形式的Odata-Model。

这会使所有缓存的条目无效,并强制对绑定进行新的读取:

https://sapui5.hana.ondemand.com/#/api/sap.ui.model.odata.v2.ODataModel%23methods/invalidate