骨干路由未被调用

时间:2012-12-10 04:18:49

标签: backbone.js requirejs backbone-boilerplate

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

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

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的底部。我和那里的第一个评论者有同样的问题。

1 个答案:

答案 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永远不会被加载。


解决方案是:

  1. 作为Backbone.js docs注释,修改服务器代码,以便服务器为每个Backbone路由呈现正确的内容,或
  2. (我认为这更容易)在网络服务器(IISApache)上放置了一个URL重写,以便它会返回index.html以查找任何请求骨干路线,如index.html/report/printindex.html/report/add
  3. 例如,在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>