主干路由器导航到../#/<路由>而不触发路由器事件.如何

Backbone router navigate to .../#/<route> without triggering router event. How to?

本文关键字:路由器 如何 事件 导航 路由      更新时间:2023-09-26

不知道如何强制骨干网正确导航到这样的路由:

页面/#/频道/名称

而不是

页面#频道/名称

页面#/频道/名称

我的路由器使用一个主模型并观察其状态,因此在这种情况下,路由器应该能够在不触发其事件的情况下更改 URL。

我试着这样做:

router.navigate("#/channel/" + encodeURIComponent(appState.data.channelName), { trigger: false });

但在这种情况下,"触发器:false"不起作用,所以我收到了不希望的路由器事件调用。

Backbone.history 根设置为"/",我目前没有使用 pushState。

请参阅下面的代码示例:

var Router = Backbone.Router.extend({
    routes: {
        "": "index",            
        "index": "index",
        "channel/:channelName": "changeChannel"
    },
    initialize: function (options) {
        var router = this;
        if (options.model) {
            router.model = options.model;
        } else {
            //TODO: throw error
            return;
        }
        //update url in cases of model channelSelection changes
        router.model.on("stateChangeAccepted", function (appState) {
            switch (appState.mode) {
                case "channel":
                    router.navigate("/channel/" 
                        + encodeURIComponent(appState.data.channelName), { trigger: false });
                    break;                    
            }
        });
    },
    index: function () {
        var router = this;
        router.model.trigger("stateChangeRequest", {
            mode: "channel",
            data: {
                channelIndex: 0
            }
        });
    },
    changeChannel: function (channelName) {
        var router = this;
        router.model.trigger("stateChangeRequest", {
            mode: "channel",
            data: {
                channelName: decodeURIComponent(channelName)
            }
        });
    }
});
您的

router.navigate呼叫与您定义的路由不匹配:

routes: {
  "": "index",            
  "index": "index",
  "channel/:channelName": "changeChannel"
},

这意味着频道的 URL 应http://host.com/#channel/someChannel 。但是,您的路由器导航调用要么是router.navigate('#/channel...)的,要么是router.navigate('/channel...)的。它应该是:

router.navigate("channel/" + encodeURIComponent(appState.data.channelName), { trigger: false });

但是,如果要使用类似 http://host.com/#/channel/someChannel 的路由,那么您的路由应该是:

routes: {
  "": "index",            
  "index": "index",
  "/channel/:channelName": "changeChannel"
},

您的导航呼叫应该是:

router.navigate("/channel/" + encodeURIComponent(appState.data.channelName), { trigger: false });