在骨干路由中包含root

时间:2012-02-21 04:23:54

标签: javascript ajax backbone.js router

我注意到我正在构建一个Backbone应用程序中的一个小怪癖,并且想知道这种行为是否是预期的,或者我是否做错了......

我像这样启动Backbone.history:

Backbone.history.start({
  root: '/au/store/',
  pushState: true,
  silent: true
});

要制作后退/前进按钮导航触发路线,我需要设置如下:

router = Backbone.Router.extend({
  routes: {
    'au/store/:slug' : 'slug',
    'au/store/?*params' : 'params'
  }
});

这很好用。浏览浏览器历史记录到/au/store/?foo=bar会按预期触发“参数”路径。

我遇到的问题是router.navigate()不会触发路线:

router.navigate('?foo=bar', {trigger:true});   // route doesn't trigger

将根添加到网址也不起作用:

router.navigate('au/store/?foo=bar', {trigger:true});  // navigates to /au/store/au/store/?foo=bar

所以我现在使用的解决方法是两次运行所有路由,一次是以前缀为前缀,一次是没有:

routes: {
  'au/store/:slug' : 'slug',
  'au/store/?*params' : 'params',
  ':slug' : 'slug',
  '?*params' : 'params'
}

现在它会在后退/前进时触发路由,也可以通过router.navigate()触发。

但这似乎有点像黑客攻击,肯定会导致更复杂的路线问题......

任何人都可以向我解释我做错了什么,或者为什么它没有表现出我对它的期望?

2 个答案:

答案 0 :(得分:7)

删除路由器中的URL

router = Backbone.Router.extend({
  routes: {
    ':slug' : 'slug',
    '?*params' : 'params'
  }
});

silent设置为false以触发路径

Backbone.history.start({
  root: '/au/store/',
  pushState: true,
  silent: false
});
  

如果服务器已经渲染了整个页面,并且您不希望在启动历史记录时触发初始路由,则传递silent:true

参考 http://documentcloud.github.com/backbone/#History-start

更新

此外,您应该使用.htaccess来处理根和重定向。你需要使用这样的东西:

# html5 pushstate (history) support:
<ifModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /au/store/
    RewriteCond %{THE_REQUEST} ^.*/index.php 
    RewriteRule ^(.*)index.php$ /au/store/$1 [R,L] 
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !^/index\.php
    RewriteRule (.*) index.php
</ifModule>

并将其添加到您的头标记

<base href="/au/store/" />

现在,先生,您将获得一个完美的工作环境

答案 1 :(得分:1)

摆脱完整的网址,Backbone会自动为您预留根。所以,只需:

routes: {
    ':slug' : 'slug',
    '?*params' : 'params'
    }

你应该没事。