gpt4 book ai didi

url-routing - 如何防止用户导航离开?

转载 作者:行者123 更新时间:2023-12-05 01:33:13 24 4
gpt4 key购买 nike

在我的 SAPUI5 应用程序中,我使用 sap.tnt.Toolpage 作为主布局容器。 SideNavigation 显示应用程序链接列表,mainContents 使用 sap.ui.core.routing.Router 动态加载。

导航到我正在使用的详细信息页面

var router = sap.ui.core.UIComponent.getRouterFor(this);
router.navTo("MyDetailRoute", {
detailItemId: oItem.getBindingContext("oDataSourceName").getProperty("DETAILID")
});

这会加载一个详细 View ,然后将其控件绑定(bind)到我的数据源中的数据。

当我尝试记住用户将他的更改保存回服务器时,问题就出现了。我基本上想中断导航以询问用户是否愿意 a) 取消他的更改,b) 保存他的更改或 c) 留在详细信息页面上。虽然 a) 和 b) 很容易实现,但我不知道如何防止导航发生。

到目前为止,我已经尝试订阅 onBeforeHide 我的观点:
var view = this.getView();
var that = this;
view.addEventDelegate({
onBeforeHide: function (evt) {
var oModel = that.getModel("oDataSourceName");
if (oModel.hasPendingChanges()) {
// How to prevent leaving the page?
}
}
});

我试过的东西不起作用:
  • evt.preventDefault();
  • evt.stopPropagation();
  • 扔“东西”;

  • 选项 3) 实际上阻止了导航,但会导致以后出现问题,因为 URL 仍然会改变......

    有人有想法吗?

    编辑:感谢 cschuff 的回答,我能够让它工作。对于将来遇到同样问题的任何人:
    // In onInit: Subscribe to onBeforeHide in order to un-register event handler for hashchange

    onInit: function () {
    this.getRouter().getRoute("MyDetailRoute").attachPatternMatched(this.onNavigated, this);

    var view = this.getView();
    var that = this;

    view.addEventDelegate({
    onBeforeHide: function (evt) {
    $(window).off('hashchange');
    }
    });
    }


    // Then in onNavigate stoppen the router, saving the current window location and subscribing to hashchange (only once)
    // In hashchange use helper variable m_bSelfURLSetting to prevent the function from running when triggered by URL restore (above)
    // In the handler checking for pending changes and either resore the old URL or starting the router again if the user wants to quit or if there are no changes

    onNavigated: function (oEvent) {

    this.getRouter().stop();
    this.m_strHref = window.location.href;
    var that = this;

    $(window).off('hashchange').on('hashchange', function (e) {
    if (that.m_bSelfURLSetting) {
    that.m_bSelfURLSetting = false;
    return;
    }

    var oModel = that.getModel("oDataSourceName");
    if (oModel.hasPendingChanges()) {
    var leave = confirm('There are unsaved changes.\r\n\r\nDo you really want to leave the page?');
    if (!leave) {
    // re-set the URL
    that.m_bSelfURLSetting = true;
    window.location.href = that.m_strHref;
    }
    else {
    that.getRouter().initialize(false);
    oModel.resetChanges();
    }
    } else {
    that.getRouter().initialize(false);
    }
    });
    }

    这绝对不是那种让人引以为豪的代码......

    最佳答案

    解决方案#1 :您可以使用路由器方法 stop 暂时完全停用路由。和 initialize .这将停止监听 url 哈希中的更改,从而忽略所有路由触发器。

    从您的 Controller :

    var oRouter = sap.ui.core.UIComponent.getRouterFor(this);
    oRouter.stop();

    // later
    // passing true will interpret and navigate to the current hash (since 1.48.0)
    oRouter.initialize(true);

    解决方案#2 : 使用 sap.ui.core.routing.HashChanger 中断路由本身事件。 hashChangedhashReplaced由路由器内部使用。你也可以试试 sap.ui.core.routing.Router routeMatchedbeforeRouteMatched是可取消的(文档没有给出任何提示)。

    解决方案#3 :一个限制较少的解决方案是仅中断从该特定 View 触发路由的所有操作。请注意,浏览器返回或手动更改 url-hash 在这里仍然有效( native JS 事件 beforeunload hashchange 可能在这里有所帮助)。

    克里斯

    关于url-routing - 如何防止用户导航离开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47304115/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com