История Backbone.js "об изменении маршрута"?

Есть ли общее событие, которое срабатывает каждый раз, когда мы переходим на другой URL?

window.App =
  Models: {}
  Collections: {}
  Views: {}
  Routers: {}

  init: ->
    # Initialize Routers
    new App.Routers.Main()

    # Initialize History
    Backbone.history.start(pushState: true)

    # BIND VIEW CHANGE?
    $(@).on 'changeOfRoute', -> 
      console.log "Different Page" 

$(document).ready ->
  App.init()

Это возможно, но я ищу общее решение.

4 ответа

Решение

На маршрутизаторе есть событие "route":

http://backbonejs.org/

  • "маршрут" (маршрутизатор, маршрут, параметры) - запускается по истории (или маршрутизатору), когда был найден какой-либо маршрут.

Это позволяет привязывать к конкретным маршрутам.

Если вы хотите запустить обработчик после любого маршрута, свяжите с "route", и маршрут будет первым аргументом:

myRouter.on("route", function(route, params) {
    console.log("Different Page: " + route);
});

Это будет запускать события только для ваших явно определенных маршрутов. Если вы хотите инициировать события для маршрутов, которые не определены явным образом, добавьте маршрут "splat" согласно разделу " Как обнаружить недопустимый маршрут и функцию запуска в Backbone.Controller".

Из документации Backbone

Этот метод вызывается внутри маршрутизатора, всякий раз, когда маршрут совпадает и его соответствующий обратный вызов должен быть выполнен. Переопределите его, чтобы выполнить пользовательский анализ или перенос ваших маршрутов, например, для анализа строк запроса перед передачей их обратному вызову маршрута, например, так:

var Router = Backbone.Router.extend({
  execute: function(callback, args) {
    args.push(parseQueryString(args.pop()));
    if (callback) callback.apply(this, args);
  }
});

На этом сайте есть некоторый полезный код для переопределения маршрутизатора для поддержки перехватчиков "до" и "после", хотя для этого потребуется обновление при каждом изменении версии Backbone.

@TTT: К сожалению, Backbone не дает нам событие до / после, поэтому вам нужно будет перезаписать или расширить Router.route. Вы можете найти способ сделать это в этом ответе: https://stackru.com/a/16298966/2330244

Может быть, это расширение будет полезно для вас: https://github.com/zelibobla/Backbone.RewindableRoute/blob/master/backbone.rewindableRoute.js

Другие вопросы по тегам