2012-02-21 50 views
2

我注意到中的骨干应用我建,并想知道,如果这种行为意味着可以预期的,或者如果我做错了轻微的怪癖......包括根主干航线

我火了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会触发'params'路线。

我有虽然是router.navigate()不会触发路由问题:

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

添加根到URL不起作用或者:

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()触发后退/前进路线。

但是,这似乎是一个黑客位,并一定会导致停机更复杂的路线轨迹问题......

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

+0

因此,这是固定的骨干0.9.2 ,它现在按照它应该的方式工作(如同在这个问题的两个答案中所述)。 – market 2012-06-06 02:37:14

回答

1

摆脱完整的网址,Backbone会自动为您预先安装根目录。所以,只需要:

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

你应该没问题。

+0

当通过'router.navigate()'触发路由时,此功能正常工作,但在使用后退/前进按钮进行导航时无法识别路由。 – market 2012-02-22 00:19:05

+0

^如果我设置了一个'* params'路由,它会将整个'au/store/params'传递给回调... – market 2012-02-22 00:25:18

7

得到路由器

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

设置silentfalse火的路线

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

如果服务器已经呈现整个页面摆脱网址,和你不不想在启动历史记录时触发初始路线,请传递无声:真

参考 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/" /> 

现在的先生,你得到一个完美的工作环境

+0

问题仍然存在。除非有路由具有根目录,否则正确的路由不会在浏览器后退/前进时触发。 – market 2012-05-28 01:14:10