ручная перезагрузка вызывает ошибку при привязке контекста привязки - PullRequest
0 голосов
/ 25 сентября 2018

При реализации базового контроллера я столкнулся с неожиданной ошибкой.Приведенный ниже код работает нормально (то есть, создается связующий текст), когда пользователь переходит к представлению.Если пользователь перезагружает страницу вручную, контекст остается неопределенным.Я отладил код, и модель является одним и тем же объектом в обоих сценариях.На данный момент я добавил ручную проверку, чтобы предотвратить ошибки.Вопрос: Почему не создается обязательный контекст?

Cheers

sap.ui.define([
    "de/nordakademie/bookatrip/controller/BaseController",
    "sap/ui/core/routing/History",
    "sap/m/MessageToast"],
function (BaseController, History, MessageToast) {
    "use strict";
    return BaseController.extend("de.nordakademie.bookatrip.controller.BaseDetail", {
        onInit: function () {
            this._getRouter()
                .getRoute("detail")
                .attachPatternMatched(this._onDetailRouteMatched, this);
        },
        _onDetailRouteMatched: function (oEvent) {
            const oArgs = oEvent.getParameter("arguments");
            const oView = this.getView();
            const i18n = this.getI18nBundle();
            const oContext = oView
                .getModel("trip")
                .createBindingContext("/" + oArgs.path);
            /**
             * in case of manual browser reload, binding the context will fail (why?)
             * to prevent unexpected errors on tis view, the user will be navigated to
             * previous page
             */
            if (oContext) {
                oView.setBindingContext(oContext, "trip");
            } else {
                MessageToast.show(i18n.getText("detail.binding.navback"),
                    {closeOnBrowserNavigation: false});
                this.onNavButtonPress()
            }
        }
});

1 Ответ

0 голосов
/ 28 сентября 2018

Есть ли конкретная причина, по которой вы вручную создаете BindingContext?Обычно мы используем метод bindElement для привязки представления.

Когда вы используете метод bindElement, платформа заботится о повторном использовании существующих привязок, если страница перезагружается (на самом деле это не полная перезагрузка), а точнее повторное совпадение с тем же маршрутом).

Попробуйте сделать это следующим образом:

    _onDetailRouteMatched: function (oEvent) {
        const oArgs = oEvent.getParameter("arguments");
        const oView = this.getView();
        const i18n = this.getI18nBundle();

        oView.bindElement({
            model: "trip",
            path: "/" + oArgs.path
        });
    }

Obs: Вы также можете связать его, используя название модели как частьпуть, как это:

        oView.bindElement("{trip>/" + oArgs.path + "}");
...