【发布时间】:2012-06-26 14:52:16
【问题描述】:
不知道如何强制主干正确导航到这样的路由:
页面/#/频道/名称
而不是
页面#频道/名称
或
页面#/频道/名称
我的路由器使用一个主要模型并观察其状态,因此在这种情况下路由器应该能够在不触发其事件的情况下更改 URL。
我试着这样做:
router.navigate("#/channel/" + encodeURIComponent(appState.data.channelName), { trigger: false });
但在这种情况下“触发器:假”不起作用,所以我收到了路由器事件的不良调用。
Backbone.history root 设置为“/”,我目前没有使用 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)
}
});
}
});
【问题讨论】:
-
避免使用前导斜杠,所以不要使用 /page#/channel/ 而是使用 /page#channel。 Backbone 文档中记录了这样做会更好。这可能会解决您的问题
-
我知道,不用斜线也能正常工作。我只是想获取 page/#/channel URL,类似于 Twitter