骨干路由未被调用

Bra*_*don 10 requirejs backbone.js backbone-boilerplate

我有一个奇怪的问题,我还没有弄清楚.这很简单,这可能就是我遇到麻烦的原因:)

首先,这是路由表......

routes: {
    '': 'root', //called
    'report': 'report', // called
    'report/add': 'reportAdd', // not called
    'report/print': 'reportPrint', // not called
    'report/settings': 'reportSettings', // not called
},
Run Code Online (Sandbox Code Playgroud)

你会看到我标记哪些是有效的,哪些不是.问题归结为所有子路由(即report/add)不匹配.

在main.js中正确调用骨干历史记录,如下所示:

app.Router = new Router();
Backbone.history.start({ pushState: true });
Run Code Online (Sandbox Code Playgroud)

显然,这是在正确的位置,因为路线工作不是子路线.我已经尝试过没有运气的root选择Backbone.history和沉默parameter.

我想这是一个配置/设置问题,但我找不到任何答案.我究竟做错了什么?任何帮助深表感谢.

顺便说一下,我使用的是requirejs和Backbone Boilerplate,但我不知道这会有什么影响.

更新:虽然提供的答案在技术上是正确的,但问题在于Backbone Boilerplate.有关说明,请参阅此博客文章的底部.我和那里的第一个评论者有同样的问题.

McG*_*gle 10

正如评论中所讨论的,问题在于,当使用推送状态样式URL时,服务器无法识别Backbone路由URL.

例如,假设您的应用程序的根位于server/app/index.html,并且您正在尝试使用Backbone路由到的URL /report/print.使用URL 片段路由,这很好:

http://server/app/index.html#report/print
Run Code Online (Sandbox Code Playgroud)

服务器忽略后面的部分#并返回index.html; 然后加载Backbone路由到report/print.

但是,如果您使用推送状态路由,则URL如下所示:

http://server/app/index.html/report/print
Run Code Online (Sandbox Code Playgroud)

并且服务器抛出404错误,因为它无法识别该路径上的任何内容,因此Backbone永远不会被加载.


解决方案是:

  1. 正如Backbone.js文档所述,修改服务器代码,以便服务器为每个Backbone路由呈现正确的内容,或者
  2. (我认为这是比较容易)把一个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>
Run Code Online (Sandbox Code Playgroud)