SAPUI5 - Как получить расширенный контекст из подробного представления - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь получить контекст из развернутого объекта в подробном представлении, но когда я использую параметр расширения, он возвращает только список ключей. Я пробовал использовать oModel.read с указанными ключами в списке, но безуспешно.

Может ли кто-нибудь мне с этим помочь?

Вот мой код:

onInit : function () {
    var oViewModel = new JSONModel({
        busy : false,
        delay : 0,
        lineItemListTitle : this.getResourceBundle().getText("detailLineItemTableHeading")
    });

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

    this.setModel(oViewModel, "detailView");

    this.getOwnerComponent().getModel().metadataLoaded().then(this._onMetadataLoaded.bind(this));

},

_onObjectMatched : function (oEvent) {
    var sObjectId =  oEvent.getParameter("arguments").objectId;

    this.getModel("appView").setProperty("/layout", "TwoColumnsMidExpanded");
    this.getModel().metadataLoaded().then( function() {
        var sObjectPath = this.getModel().createKey("Categories", {
            CategoryID :  sObjectId
        });
        this._bindView("/" + sObjectPath);
    }.bind(this));
},


_bindView : function (sObjectPath) {
    // Set busy indicator during view binding
    var oViewModel = this.getModel("detailView");

    oViewModel.setProperty("/busy", false);

        this.getView().bindElement({
        path : sObjectPath,
        parameters : {
            expand: "Products"
        },
        events: {
            change : this._onBindingChange.bind(this),
            dataRequested : function () {
                oViewModel.setProperty("/busy", true);
            },
            dataReceived: function () {
                oViewModel.setProperty("/busy", false);
            }
        }
    });
},

_onBindingChange : function () {
    var oView = this.getView(),
        oElementBinding = oView.getElementBinding();


    // No data for the binding
    if (!oElementBinding.getBoundContext()) {
        this.getRouter().getTargets().display("detailObjectNotFound");
        // if object could not be found, the selection in the master list
        // does not make sense anymore.
        this.getOwnerComponent().oListSelector.clearMasterListSelection();
        return;
    }

    var sPath = oElementBinding.getPath(),
        oResourceBundle = this.getResourceBundle(),
        oObject = oView.getModel().getObject(sPath),
        sObjectId = oObject.CategoryID,
        sObjectName = oObject.CategoryName,
        oViewModel = this.getModel("detailView"),
        oBindingContext = this.getView().getBindingContext().getObject();

        console.log("Object ", oObject);

    this.getOwnerComponent().oListSelector.selectAListItem(sPath);

        oViewModel.setProperty("/shareSendEmailSubject",
    oResourceBundle.getText("shareSendEmailObjectSubject", [sObjectId]));
    oViewModel.setProperty("/shareSendEmailMessage",
    oResourceBundle.getText("shareSendEmailObjectMessage", [sObjectName, sObjectId, location.href]));
},

И вывод:

вывод

Ожидаемый результат:

ожидаемый результат

1 Ответ

0 голосов
/ 19 июня 2020

именно так ODataModel хранит информацию.

Если вы читаете EntitySet с параметром Expand, он запросит все эти данные. Но в сущности «Категория (1)» сохраняется только ссылка / путь к сущностям продукта.

via. this.getView().getModel().getProperty("/" + "Products(1)") вы получаете доступ к объекту Entity.

через. this.getView().getModel().getProperty("/") вы можете получить доступ ко всем объектам запрошенной модели обслуживания, включая ваши продукты.

Чего именно вы не хотите достичь?

...