骨干路由器为/ en /#xyz而不是/ #en / xyz

时间:2012-04-09 12:55:36

标签: javascript backbone.js pushstate

我正在尝试做一些非常简单的事情。

以下是该方案: 我有一个完整的网站与支持pushstate的浏览器一起工作。该网站的工作原理是语言是“实际页面”,例如:

/en/whatever/etc  = index.en.php with  with english headers and encoding & tweaks
/ar/whatever/etc  = index.ar.php with  with arabic headers and encoding & tweaks
/ru/whatever/etc  = index.ru.php with  with russian headers and encoding & tweaks

正如我所提到的,它非常光滑,与pushstate很好地配合使用。问题是当我尝试将相同的路由器代码与哈希替代方案一起使用时。

Backbone的路由器似乎想要这样做:

/#/en/whatever/etc = bad because it's not based correctly
/#/ar/whatever/etc = and so on

我想要它做的是:

/en/#whatever/etc
/ar/#whatever/etc
/ru/#whatever/etc
..and so on

or even:

/en/#/whatever/etc
/ar/#/whatever/etc
/ru/#/whatever/etc
..and so on

但是如果没有调整骨干源来实现这一点,我找不到方法。我有点反对改变backbone.js,除非我真的不得不因为未来的防范因素。

有人有任何想法吗?

1 个答案:

答案 0 :(得分:5)

您需要使用Backbone History object:

中的root选项

引用文档:

  

如果您的应用程序未通过域的根网址提供,请务必告知历史记录根目录的位置,作为选项:Backbone.history.start({pushState: true, root: "/public/search/"})

您将不得不在目标网页上执行一些代码,这些代码会查看他们正在使用的语言,然后将其发送到/[LANG CODE]/。然后在您的服务器上,您只需将/[LANG CODE]/的请求映射到您的.html文件。

在HTML文件中查看location.pathname变量,删除第一个/[LANG CODE]/部分,并将其用作选项哈希的root值。

var lang = "/"+_.first(location.pathname.split('/')+"/";
Backbone.history.start({pushState: true, root: lang}); // if you're using pushState, otherwise omit or set to false

这会导致您的网址为:

/en/#whatever/etc
/ru/#whatever/etc