2012-04-01 8 views
15

Sto usando Backbone.js e jQuery-mobile. jQuery-mobile routing è disabilitato e sto usando la lib solo per l'interfaccia utente. Ho trovato tutto funzionante, tranne la selezione della transizione della pagina. Devo passare la transizione della pagina ('slice-up', 'fade', 'slide-down') al router Backbone perché la transizione varia a seconda della provenienza dell'utente.Come posso passare la stringa di query al routing backbone.js

ho pensato un modo molto brutto per farlo, per passare loro tramite l'url:

class App.Routers.Foods extends Backbone.Router 
    routes: 
    '': 'index' 
    ':transition': 'index' 
    'foods/new': 'new' 
    'foods/new/:transition': 'new' 

    initialize: -> 
    @collection = new App.Collections.Foods() 
    @collection.fetch() 

    index: (transition)-> 
    view = new App.Views.FoodIndex(collection: @collection) 
    App.changePage(view, transition) 

    new: (transition)-> 
    view = new App.Views.FoodNew(collection: @collection) 
    App.changePage(view, transition) 

ecco il link html per la transizione predefinita:

<a href="#" data-icon="back" class="ui-btn-left">Back</a> 

ecco il link html per la dissolvenza di transizione:?

<a href="#fade" data-icon="back" class="ui-btn-left">Back</a> 

Utilizzando la stringa di query, ovvero/cibo/nuova transizione = 'dissolvenza' è sicuramente Bett ma non so come definire il routing del backbone per usare le variabili della stringa di query.

Come devo fare?

Esiste un modo più elegante per gestire il mio problema, ovvero passare la variabile non utilizzando l'url?

risposta

12

Sarà necessario analizzare manualmente il parametro URL all'interno delle funzioni del router.

class App.Routers.Foods extends Backbone.Router 
    routes: 
    '': 'index' 
    'foods/new': 'new' 

    initialize: -> 
    @collection = new App.Collections.Foods() 
    @collection.fetch() 

    index:()-> 
    view = new App.Views.FoodIndex(collection: @collection) 
    App.changePage(view, getQueryVariable('transition')) 

    new:()-> 
    view = new App.Views.FoodNew(collection: @collection) 
    App.changePage(view, getQueryVariable('transition')) 

JS function per analizzare parametri di query.

function getQueryVariable(variable) { 
    var query = window.location.search.substring(1); 
    var vars = query.split("&"); 
    for (var i = 0; i < vars.length; i++) { 
     var pair = vars[i].split("="); 
     if (pair[0] == variable) { 
      return unescape(pair[1]); 
     } 
    } 
    return false; 
} 

Ovviamente è necessario convertire la funzione JS in CS ma si ottiene l'idea.

+7

'unescape' nel 2012? Ti consiglio di lasciare 'escape' e' unescape' nella pattumiera della cronologia, 'encodeURIComponent' e [' decodeURIComponent'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/decodeURIComponent) sono di solito cosa tu vuoi usare. –

+1

Il problema è uno. Le rotte non corrisponderanno all'url contenente stringhe di query. È necessario utilizzare un'espressione regolare per definire percorsi che consentono la stringa di query. – PreslavLe

+6

Ho trovato questo plug-in backbone che fa esattamente ciò di cui ho bisogno! https://github.com/jhudson8/backbone-query-parameters – PreslavLe

Problemi correlati