Можно ли с помощью Backbone.js заставить маршрутизатор перейти на страницу, откуда он пришел? Я хотел бы использовать это для случая, когда я меняю свой URL-адрес, когда появляется всплывающее окно, и я хочу изменить его обратно, когда я скрываю всплывающее окно. Я не хочу просто возвращаться назад, потому что я хочу сохранить фоновую страницу точно в том же положении, в котором я оставил ее до того, как показал всплывающее окно.
Тихо изменить URL-адрес на предыдущий, используя Backbone.js
Ответы (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()
, который перенаправит вас обратно к последнему «хешу».
Я думаю, что ответ 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()
Этот ответ может не касаться вопроса, но это почти та же проблема. Я не мог автоматически перейти к предыдущему маршруту или пользовательскому маршруту из-за косой черты в конце. Чтобы функции маршрута НЕ запускались, используйте {trigger:false}
или вообще не используйте триггер, поскольку false
является поведением по умолчанию, и убедитесь, что ваш маршрут начинается с #something
вместо '#/что-то' (обратите внимание на косую черту), или измените регулярное выражение внутри Backbone.js, часть маршрутизатора.
Вы можете запустить маршрут в onCloseEvent вашего всплывающего окна или наложения с помощью:
router.navigate('/lasturl/');
Это установит URL. Если вы передадите true в качестве второго параметра, вы также выполните действие маршрута. В противном случае страница останется без изменений.
http://documentcloud.github.com/backbone/#Router-navigate