2013-06-27 39 views
13

Przeprowadzam migrację pojedynczej strony internetowej opartej na plikach Backbone.js i jQuery do rozszerzenia przeglądarki Chrome. Jednak ani tryby routera oparte na hashbang pushState wydają się dobrze działać w środowisku w obrębie rozszerzenia. Doszedłem do wniosku, że lepiej mi jest po prostu wyświetlać widoki interakcji użytkownika, omijając system window.location. Jednak nie jestem zbyt pewny, jak zaimplementować to bez zmiany połączeń do Router.navigate w kilkudziesięciu plikach.Trasowanie Backbone.js bez zmiany adresu URL

Czy istnieje sposób wtykany/modułowy, aby utrzymać system routingu Szkieletów, ale ominąć wszelkie zmiany w adresie URL?

Odpowiedz

22

I naprawdę chcesz trzymać się z użyciem Router.navigate korzystać z routingiem system, który Backbone.js zapewnia bez konieczności radzenia sobie z błędami hashbang, gdy jest używany w rozszerzeniu Chrome (np. trasy zawierające ukośnik jest nadpisywany), możesz ustawić adres URL bezpośrednio, pomijając całą gimnastykę pushState.

To jest rzeczywiście dość łatwe do osiągnięcia:

Router = Backbone.Router.extend({ 

    navigate: function (url) { 

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

    }, 

    // Put routes here 
    routes: { } 

}); 

Można połączyć Router.navigate(url) załadować nową trasę bez zmieniania historii, a nawet wiązać działania do każdego linku zawierającego atrybut data-backbone (np <a href="login" data-backbone>Login</a>) z zdarzenie takie jak to:

$(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

Możesz na nowo zdefiniować, co robi Router.navigate, ale lepiej jest nie używać całego Background.routera. Myślę, że może to spowodować pewne zamieszanie, a Twój kod będzie czystszy bez niego, jeśli obecnie wywołujesz zmiany w historii z widoków.

ma koncepcję Kontrolerów, które działają podobnie jak routery bez mapy URL (z Marionetką, chodzi o to, aby zachować minimalne definicje trasy, a zamiast tego kontrolerów wywołań). Nie musisz też używać żadnego z elementów Marionetek, których nie chcesz.

Jeśli naprawdę chciał trzymać się z routerem, jak to jest, można prawdopodobnie tylko przedefiniować Backbone.History.navigate do (uwaga, niesprawdzonych)

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 jest tym, co powinno być używane zamiast routera. Klasa Marionette Controller jest teraz przestarzała - każdy obiekt może służyć jako kontroler do użycia przez AppRoutera. – Paul