Как отслеживать события изменения маршрутизатора в Backbone.js

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

В частности, я хочу отправить новый URL-адрес в приложение для аналитики.

Ответ 1

@qwertymk был на полпути. Вы можете посмотреть событие hashchange в окне:

// jQuery example
$(window).bind('hashchange', function(){
    console.log(window.location.hash);
});

Ответ 2

Я знаю, что это старый пост, но, как предположил @kirk, Backbone.js уже построил его.

Backbone.history.on("all", function (route, router) {
    //console.log(window.location.hash);
});

Я думаю, вам лучше использовать этот метод.

Ответ 3

поместите это где-то сверху в свой код

Backbone.History.prototype.navigate = _.wrap(Backbone.History.prototype.navigate, function(){
    // Get arguments as an array
    var args = _.toArray(arguments);
    // firs argument is the original function
    var original = args.shift();
    // Set the before event
    Backbone.history.trigger('before:url-change', args);
    // Call original function
    var res = original.apply(this, args);
    // After event
    Backbone.history.trigger('url-changed');
    // Return original result
    return res;
});

приведенный выше код будет обертывать функцию History.navigate и будет запускать "before: url-change" и "url-changed", когда он вызывается

Позже вы можете использовать

Backbone.history.bind('before:url-change', function(path,e){
    console.log("before url change", path, e)
});

Ответ 4

Существует еще одно событие "Backbone.history.on(" route ",...)", которое также работает, и вы можете обнаружить, что он запущен в библиотеке):

Backbone.history.on('route', function() {debugger;});

Это более точно, потому что "все" - это уловка: Цитата из документации Backbone:

Запуск одного или нескольких событий, запуск всех связанных обратных вызовов. Обратные вызовы передаются теми же аргументами, что и trigger, кроме имени события (если вы не слушаете "all"), что приведет к тому, что ваш обратный вызов получит истинное имя события в качестве первого аргумента).

Кстати, наилучшей практикой Backbone является использование метода listenTo, например:

myView.listenTo(Backbone.history, 'route', function() {debugger;})

Таким образом, вам не нужно очищать прослушиватель событий вручную - вместо этого он логически связан с представлением/моделью и т.д. который использует его.