我有一个奇怪的问题,我一直无法弄清楚的呢。 这很简单,这可能是为什么我在与它麻烦:)
首先,这里的路由表...
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
的选择Backbone.history
和无声的parameter
都没有任何的运气。
我想这是一个配置/设置问题,但我一直没能找到任何答案。 我究竟做错了什么? 任何帮助深表感谢。
顺便说一句,我使用requirejs和骨干样板,但我不明白怎么会有所作为。
更新:虽然提供的答案是技术上是正确的,问题是骨干样板。 看到这个底部博客文章作出解释。 我有同样的问题,因为第一个评论者那里。
正如在评论中讨论的,问题是,使用推送状态风格的URL时,服务器无法识别主干航线的URL。
为了说明,假设您的应用程序的根在server/app/index.html
,和你想使用的URL骨干路由/report/print
。 随着网址片段路由 ,这是好的:
http://server/app/index.html#report/print
服务器忽略之后的部分#
和回报的index.html; 然后负载骨干路由report/print
。
但是,如果你正在使用推状态路由 ,那么URL看起来是这样的:
http://server/app/index.html/report/print
而服务器抛出一个404错误,因为它并不在这条道路承认任何东西,所以骨干,是从来没有加载。
的解决方案是:
- 由于Backbone.js的文档注,修改服务器代码,以便服务器使每个骨干网的路由正确的内容,或
- (我认为这是比较容易)把一个URL重写来代替Web服务器(在IIS , Apache的 ),这样它会返回
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>