Data binding 绑定绑定上下文时,手动重新加载会导致错误

Data binding 绑定绑定上下文时,手动重新加载会导致错误,data-binding,sapui5,Data Binding,Sapui5,在实现基本控制器时,我遇到了一个意外错误。当用户导航到视图时,下面的代码工作正常(意味着创建了bindingContext)。如果用户手动重新加载页面,则上下文保持未定义状态。我调试了代码,模型在两种场景中都是同一个对象。现在,我添加了一个手动检查来防止错误。问题是:为什么不创建绑定上下文? 干杯 sap.ui.define([ "de/nordakademie/bookatrip/controller/BaseController", "sap/ui/core/routing/

在实现基本控制器时,我遇到了一个意外错误。当用户导航到视图时,下面的代码工作正常(意味着创建了bindingContext)。如果用户手动重新加载页面,则上下文保持未定义状态。我调试了代码,模型在两种场景中都是同一个对象。现在,我添加了一个手动检查来防止错误。问题是:为什么不创建绑定上下文?

干杯

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()
            }
        }
});

手动创建BindingContext有什么具体原因吗?通常我们使用该方法来绑定视图

当您使用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 + "}");