Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 主干路由未被调用_Backbone.js_Requirejs_Backbone Boilerplate - Fatal编程技术网

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错误,因为它无法识别该路径上的任何内容,所以根本就没有加载主干


解决办法是:

  • 如前所述,修改服务器代码,以便服务器为每个主干路由呈现正确的内容,或者
  • (我认为这更容易)在web服务器(,)上进行URL重写,这样它将返回
    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>
    
    
    
    这应该很好用(),你在做什么,而小提琴不是?问题出在臭烘烘的
    pushState
    选项上。现在我有了散列(#report/add)URL,但它确实有效。我如何摆脱散列URL并使用pushState?因此当您不使用
    pushState
    时,
    可以工作,但当您使用
    pushState
    时,
    会失败?不,
    可以工作,但它会自动将#添加到URL中。在
    /report/add`上重新加载页面失败,但访问
    #report/add有效。我知道这很奇怪。我认为在使用推送状态URL时,必须包含某种服务器端URL重写,不是吗?也就是说,当您的服务器接收到像
    /report/add
    这样的请求时,您必须确保服务器知道返回
    /index.html
    或其他内容。