我有一个奇怪的问题,我还没有弄清楚。这很简单,这可能就是我遇到麻烦的原因:)
首先,这是路由表......
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 });
显然,这是在正确的位置,因为路线工作的不是子路线。我已经尝试了root
的{{1}}选项和无声的Backbone.history
,但没有任何运气。
我认为这是配置/设置问题,但我找不到任何答案。我究竟做错了什么?非常感谢任何帮助。
顺便说一句,我使用的是requirejs和Backbone Boilerplate,但我不知道这会产生什么影响。
更新:虽然提供的答案在技术上是正确的,但问题出在Backbone Boilerplate上。有关说明,请参阅此blog post的底部。我和那里的第一个评论者有同样的问题。
答案 0 :(得分:10)
正如评论中所讨论的,问题在于,当使用推送状态样式URL时,服务器无法识别Backbone路由URL。
例如,假设您的应用程序的根位于server/app/index.html
,并且您尝试使用Backbone路由到/report/print
的URL。使用网址片段路由,这很好:
http://server/app/index.html#report/print
服务器忽略#
之后的部分并返回index.html;然后加载Backbone路由到report/print
。
但如果您使用推送状态路由,则网址如下所示:
http://server/app/index.html/report/print
服务器抛出404错误,因为它无法识别该路径上的任何内容,因此Backbone永远不会被加载。
解决方案是:
index.html
以查找任何请求骨干路线,如index.html/report/print
,index.html/report/add
等例如,在IIS中,您将以下内容放在应用程序根目录下的web.config中:
<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>