Тихо изменить URL-адрес к предыдущему с помощью Backbone.js - PullRequest
8 голосов
/ 07 декабря 2011

Используя Backbone.js, можно ли заставить маршрутизатор перейти на страницу, с которой он пришел?Я хотел бы использовать это для случая, когда я изменяю свой URL, когда появляется всплывающее окно, и я хочу изменить его, когда я скрываю всплывающее окно.Я не хочу просто возвращаться, потому что я хочу, чтобы фоновая страница была точно в том же положении, в каком я ее оставила до того, как показала всплывающее окно

Ответы [ 4 ]

14 голосов
/ 28 апреля 2012

Вы можете решить эту проблему, расширив Backbone.Router и сохранив все маршруты во время навигации.

class MyRouter extends Backbone.Router
  constructor: (options) ->
    @on "all", @storeRoute
    @history = []
    super options

  storeRoute: ->
    @history.push Backbone.history.fragment

  previous: ->
    if @history.length > 1
      @navigate @history[@history.length-2], true 

Затем, когда вам нужно отклонить ваш модальный режим, просто вызовите метод MyRouter.previous(), который будетперенаправить вас обратно к последнему "хешу".

1 голос
/ 25 сентября 2012

Я думаю, что ответ mateusmaso в основном правильный, но требует некоторых настроек, чтобы гарантировать, что вы всегда получите правильный URL-адрес, который вы ищете.

Сначала вам нужно переопределить метод route, чтобы вызвать метод beforeRoute:

route: (route, name, callback) =>
   Backbone.Router.prototype.route.call(this, route, name, =>
     @trigger('beforeRoute')
     callback.apply(this, arguments)
   )

Затем вы связываете событие и инициализируете переменную экземпляра истории:

initialize: (options) ->       
   @history = []
   @on "beforeRoute", @storeRoute

Затем создайте вспомогательные методы для хранения и извлечения фрагмента:

storeRoute: =>
   @history.push Backbone.history.fragment

previousFragment: =>
   @history[@history.length-2]

НаконецВам нужен один последний вспомогательный метод, который можно использовать для изменения URL-адреса без перезагрузки и сохранения полученного фрагмента.Вы должны использовать это при закрытии всплывающего окна, иначе у вас не будет ожидаемого фрагмента в истории, если пользователь снова откроет всплывающее окно, не переходя никуда еще.Это связано с тем, что при вызове navigate без «trigger: true» обработчик события не запустит сохранение фрагмента.

changeAndStoreFragment: (fragment) =>
   @navigate(fragment)
   @storeRoute()
0 голосов
/ 03 января 2015

Этот ответ может не касаться вопроса, но это почти та же проблема.Я не мог молча перейти к предыдущему или пользовательскому маршруту из-за косой черты.Чтобы НЕ запускать функции маршрута, используйте {trigger:false} или вообще не используйте триггер, поскольку false является поведением по умолчанию, и убедитесь, что ваш маршрут начинается с #something вместо '# / что-то' (обратите внимание на косую черту), или измените regEx внутри Backbone.js, часть маршрутизатора.

0 голосов
/ 07 декабря 2011

Вы можете запустить маршрут в onCloseEvent вашего всплывающего окна или оверлея с помощью:

router.navigate('/lasturl/');

Это установит URL.Если вы передадите true в качестве второго параметра, вы также выполните действие маршрутов.В противном случае страница останется без изменений.

http://documentcloud.github.com/backbone/#Router-navigate

...