Тихо изменить URL-адрес на предыдущий, используя Backbone.js

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


person user802232    schedule 07.12.2011    source источник


Ответы (4)


Вы можете решить эту проблему, расширив 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(), который перенаправит вас обратно к последнему «хешу».

person mateusmaso    schedule 28.04.2012
comment
на самом деле вы могли бы просто сохранить только последний хэш вместо истории дыр - person mateusmaso; 28.04.2012
comment
Спасибо! Именно то, что я искал. - person Felipe; 14.08.2012
comment
Я не думаю, что это гарантирует, что метод storeRoute всегда будет вызываться перед методом маршрутизации, который может его использовать. В результате то, что хранится в истории, не будет согласованным. - person DrewB; 25.09.2012
comment
Это может быть глупый вопрос, но я никогда раньше не видел такого синтаксиса для JS, он что-то запускает или сначала компилирует? - person jamie-wilson; 28.01.2013
comment
эй, @jamie-wilson, я пишу с помощью coffeescript.. посмотри, есть полезные функции и сахарный синтаксис, он компилируется в оптимизированный javascript, а затем coffeescript.org - person mateusmaso; 28.01.2013

Я думаю, что ответ 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-адреса без перезагрузки и сохранения полученного фрагмента. Вам нужно использовать это при закрытии всплывающего окна, иначе у вас не будет ожидаемого фрагмента в вашей истории, если пользователь снова получит всплывающее окно без навигации в другом месте. Это связано с тем, что вызов навигации без «триггера: true» не приведет к тому, что обработчик событий сохранит фрагмент.

changeAndStoreFragment: (fragment) =>
   @navigate(fragment)
   @storeRoute()
person DrewB    schedule 25.09.2012

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

person man    schedule 03.01.2015

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

router.navigate('/lasturl/');

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

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

person ProTom    schedule 07.12.2011
comment
Конечно, но опять же вопрос в том, как узнать, какой последний URL? Предоставляет ли Backbone полезный метод, или мне придется получить его из window.history? - person user802232; 08.12.2011