2012-04-01 8 views
15

Estoy usando Backbone.js y jQuery-mobile. El enrutamiento de jQuery-mobile está deshabilitado y estoy usando lib solo para la IU. Lo tengo todo funcionando, excepto al seleccionar la transición de página. Necesito pasar la transición de página ('slice-up', 'fade', 'slide-down') al enrutador Backbone porque la transición varía en función de la procedencia del usuario.¿Cómo puedo pasar la cadena de consulta al enrutamiento backbone.js?

he descubierto una manera muy fea para hacerlo, pase a ellos a través de la 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) 

Aquí está el enlace HTML para la transición por defecto:

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

Aquí está el enlace html para la transición de fundido:?

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

el uso de la cadena de consulta, es decir,/comida/nueva transición = 'fade' es, sin duda Bett pero no sé cómo definir el enrutamiento de la red troncal para usar variables de cadena de consulta.

¿Cómo debo hacer esto?

¿Hay una forma más elegante de manejar mi problema, es decir, pasar la variable sin usar la url en absoluto?

Respuesta

12

Deberá analizar manualmente el parámetro URL dentro de las funciones del enrutador.

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 para analizar parámetros de búsqueda.

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; 
} 

Por supuesto, tendrá que convertir la función JS en CS, pero ya se ha hecho.

+7

'unescape' en 2012? Recomiendo dejar 'escape' y' unescape' en el cubo de basura de la historia, 'encodeURIComponent' y [' decodeURIComponent'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/decodeURIComponent) suelen ser los que quieres usar –

+1

El es un problema. Las rutas no coincidirán con la url que contiene cadenas de consulta. Se debe usar una expresión regular para definir rutas que permitan la cadena de consulta. – PreslavLe

+6

Encontré este complemento de red troncal que hace exactamente lo que necesito. https://github.com/jhudson8/backbone-query-parameters – PreslavLe

Cuestiones relacionadas