Включение root в магистральные маршруты - PullRequest
2 голосов
/ 21 февраля 2012

Я заметил небольшую причуду в приложении 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 запускает маршрут «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

Так что обходной путь, который я использую в данный момент, состоит в том, чтобы запустить все маршруты дважды, один раз с префиксом root и один раз без:

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

И теперь он запускает маршруты назад / вперед, а также через router.navigate ().

Но это похоже на хакерство и наверняка вызовет проблемы в будущем с более сложными маршрутами ...

Может кто-нибудь объяснить мне, что я делаю неправильно, или почемуне ведет себя так, как я этого ожидаю?

Ответы [ 2 ]

7 голосов
/ 14 мая 2012

Избавьтесь от 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 голос
/ 21 февраля 2012

Избавьтесь от полных URL-адресов, Backbone автоматически подготавливает корень для вас.Итак, просто с:

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

у вас все будет хорошо.

...