2013-06-27 8 views
13

Я переношу одностраничное веб-приложение на основе Backbone.js и jQuery на расширение Chrome. Однако ни то, что pushState, ни режимы маршрутизатора на основе hashbang, похоже, хорошо работают со средой внутри расширения. Я пришел к выводу, что мне лучше просто напрямую просматривать мнения об пользовательских взаимодействиях, минуя систему window.location. Тем не менее, я не слишком уверен, как реализовать это, не меняя обращения к Router.navigate в десятках файлов.Backbone.js маршрутизация без изменения url

Есть ли подключаемый/модульный способ поддержания магистральной системы маршрутизации, но обойти любые изменения в URL-адресе?

ответ

22

Я вы действительно хотите придерживаться с помощью Router.navigate извлечь выгоду из маршрутизации система, которую Backbone.js обеспечивает без необходимости иметь дело с ошибками hashbang при использовании в расширении Chrome (например, маршруты, включая слэш, который перезаписывается), вы можете сделать Router.navigate загружать URL напрямую, пропуская всю гимнастику PushState.

Это на самом деле очень легко сделать:

Router = Backbone.Router.extend({ 

    navigate: function (url) { 

    // Override pushstate and load url directly 
    Backbone.history.loadUrl(url); 

    }, 

    // Put routes here 
    routes: { } 

}); 

Вы можете позвонить Router.navigate(url) загрузить новый маршрут, не изменяя историю, или даже связать действия для каждой ссылки, содержащей атрибут data-backbone (например <a href="login" data-backbone>Login</a>) с такое событие:

$(function(){ 

    // Initialize router 
    Router = new Router; 
    Backbone.history.start(); 

    // Bind a[data-backbone] to router 
    $(document).on('click', 'a[data-backbone]', function(e){ 
    e.preventDefault(); 

    Router.navigate($(this).attr('href')); 
    }); 

}); 
2

Вы можете переопределить то, что делает Router.navigate, но вам лучше не использовать Background.router вообще. Я думаю, что это может создать некоторую путаницу, и ваш код будет чище без него, если вы в настоящее время запускаете изменения истории из представлений.

Backbone.Marionette имеет концепцию контроллеров, которые работают так же, как маршрутизаторы без URL-карты (с помощью Marionette, идея состоит в том, чтобы сохранить минимальные определения маршрута и контроллеры вызовов для поведения). Вам также не нужно использовать какие-либо компоненты Marionette, которые вы не хотите.

Если вы действительно хотите, чтобы придерживаться с маршрутизатором, как она есть, вы, вероятно, просто переопределить Backbone.History.navigate к (заметьте, непроверенных)

navigate: function(fragment, options) { 
    if (!History.started) return false; 
    if (!options || options === true) options = {trigger: options}; 
    fragment = this.getFragment(fragment || ''); 
    if (this.fragment === fragment) return; 
    this.fragment = fragment;  
    if (options.trigger) this.loadUrl(fragment); 
} 
+1

AppRouter - то, что следует использовать вместо маршрутизатора. Класс Marionette Controller теперь устарел - любой объект может служить контроллером для использования AppRouter. – Paul