【问题标题】:Including root in backbone routes在主干路由中包含根
【发布时间】:2012-02-21 04:23:54
【问题描述】:

我注意到我正在构建的 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

将根添加到 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()。

但这似乎有点像 hack,并且肯定会在更复杂的路线上导致问题......

谁能向我解释我做错了什么,或者为什么它的行为不像我期望的那样?

【问题讨论】:

  • 所以这个问题在 Backbone 0.9.2 中得到了修复,现在它可以正常工作了(正如这个问题的两个答案中所描述的那样。)

标签: javascript ajax backbone.js router


【解决方案1】:

摆脱路由器中的 URL

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

silent 设置为false 以触发路由

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

如果服务器已经渲染了整个页面,并且您不希望在启动 History 时触发初始路由,则传递 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>

并将其添加到您的 head 标签中

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

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

【讨论】:

  • 问题依然存在。除非有包含根的路由,否则正确的路由不会在浏览器后退/前进时触发。
【解决方案2】:

摆脱完整的 URL,Backbone 会自动为您添加根目录。所以,只需:

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

你应该没事的。

【讨论】:

  • 这在通过router.navigate() 触发路线时工作正常,但在使用后退/前进按钮导航时无法识别路线。
  • ^ 如果我设置了*params 路由,它会将整个au/store/params 传递给回调...
猜你喜欢
  • 1970-01-01
  • 2012-11-25
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多