Backbone.js 主干路由未被调用
我有一个奇怪的问题,到目前为止我还没有弄清楚。这很简单,这可能就是我遇到麻烦的原因:) 首先,这是路由表Backbone.js 主干路由未被调用,backbone.js,requirejs,backbone-boilerplate,Backbone.js,Requirejs,Backbone Boilerplate,我有一个奇怪的问题,到目前为止我还没有弄清楚。这很简单,这可能就是我遇到麻烦的原因:) 首先,这是路由表 routes: { '': 'root', //called 'report': 'report', // called 'report/add': 'reportAdd', // not called 'report/print': 'reportPrint', // not called 'report/settings': 'reportSett
routes: {
'': 'root', //called
'report': 'report', // called
'report/add': 'reportAdd', // not called
'report/print': 'reportPrint', // not called
'report/settings': 'reportSettings', // not called
},
你会看到我标记了哪些有效,哪些无效。问题归结为所有子例程(即report/add
)都不匹配
主干历史在main.js中正确调用,如下所示:
app.Router = new Router();
Backbone.history.start({ pushState: true });
显然,这是正确的,因为路线正在工作,而不是子路线。我尝试了Backbone.history
的root
选项和silent参数
但都没有成功
我想这是一个配置/设置问题,但我还没有找到任何答案。我做错了什么?非常感谢您的帮助
顺便说一句,我使用的是requirejs和主干模板,但我不认为这会有什么不同
更新:尽管提供的答案在技术上是正确的,但问题在于主干模板。有关说明,请参见此部分的底部。我的问题与第一个评论员的问题相同。正如评论员中所讨论的,问题是,当使用推送状态样式的URL时,服务器无法识别主干路由URL 为了举例说明,假设您的应用程序的根目录位于
服务器/app/index.html
,并且您正试图使用一个主干路由到/report/print
的URL。使用URL片段路由,这很好:
http://server/app/index.html#report/print
服务器忽略#
之后的部分并返回index.html;然后加载主干路由到报告/打印
但是如果您使用的是推送状态路由,则URL如下所示:
http://server/app/index.html/report/print
服务器抛出一个404错误,因为它无法识别该路径上的任何内容,所以根本就没有加载主干
解决办法是:
index.html
作为主干路由的任何请求,如index.html/report/print
,index.html/report/add
,等等<rewriteMaps>
<rewriteMap name="StaticRewrites">
<add key="index.html/report/print" value="index.html" />
<add key="index.html/report/add" value="index.html" />
<!-- etc -->
</rewriteMap>
</rewriteMaps>
这应该很好用(),你在做什么,而小提琴不是?问题出在臭烘烘的pushState
选项上。现在我有了散列(#report/add)URL,但它确实有效。我如何摆脱散列URL并使用pushState?因此当您不使用pushState
时,
可以工作,但当您使用pushState
时,会失败?不,可以工作,但它会自动将#添加到URL中。在
/report/add`上重新加载页面失败,但访问
#report/add有效。我知道这很奇怪。我认为在使用推送状态URL时,必须包含某种服务器端URL重写,不是吗?也就是说,当您的服务器接收到像/report/add
这样的请求时,您必须确保服务器知道返回/index.html
或其他内容。