【发布时间】:2013-06-06 15:36:21
【问题描述】:
我使用 coenraets 的 Employee Directory 作为我的 Backbone 应用程序的起点。我想做的第一件事是更改路由以使用 HTML5 PushState 而不是 hash-hash bang-bangs。
首先我改变了:
<ul class="nav">
<li class="active"><a href="/">Home</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
那么:
Backbone.history.start({ pushState: true });
现在,如果您转到 localhost:8000/contacts 而不是 localhost:8000/#/contacts,则无论您是单击导航栏还是手动输入 URL,都会出现 404 错误。
我做错了吗?谢谢。
更新:我添加了这段代码,当我点击一个链接[stateful]时它现在可以正常工作了。但是如果我在localhost:8000/contacts 中刷新页面,我仍然会收到 404 错误 [stateless]。
$(document).on('click', 'a:not([data-bypass])', function(e){
href = $(this).prop('href')
root = location.protocol+'//'+location.host+'/'
if (root===href.slice(0,root.length)){
e.preventDefault();
Backbone.history.navigate(href.slice(root.length), true);
}
});
更新 2
除了上述代码之外,我还在我的 Express.js 应用程序中添加了以下路由。如果您仔细观察,您会注意到 URL 栏从 localhost:3000/#contact 变为 localhost:3000/contact,尽管它发生得非常快。也许有更好的方法来做这件事,但我暂时对这种方法感到满意。
app.get('/contact', function(req, res) {
res.redirect('/#contact');
});
【问题讨论】:
-
你需要做一个服务器端的URL重写,从
/contact等到根页面。 -
因此为什么默认禁用 pushState。
-
@dbaseman 谢谢,我更新了我的问题。这是正确的方法吗?
-
@TwilightPonyInc.不,不能是redirect,必须是rewrite——也就是说,当客户端请求
/contact时,服务器返回根目录的内容.我不熟悉 Express/Node,所以我不知道语法是什么......
标签: backbone.js pushstate