2012-04-01 21 views
15

Używam Backbone.js i jQuery-mobile. ruting jQuery-mobile jest wyłączony i używam biblioteki tylko dla interfejsu użytkownika. Mam wszystko działa, oprócz wyboru przejścia strony. Muszę przekazać przejście strony ("plaster-up", "fade", "slide-down") do routera Backbone, ponieważ przejście jest zależne od miejsca, z którego pochodzi użytkownik.Jak przekazać ciąg zapytania do routbone.js routing

I zorientowali się bardzo brzydki sposób to zrobić, aby przekazać je za pośrednictwem 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) 

Oto link html dla domyślnego przejścia:

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

Oto link html dla przejścia zanikającego:

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

Używanie łańcucha zapytania, tzn./food/new? transition = 'fade' to zdecydowanie bett er, ale nie wiem jak zdefiniować routing szkieletu, aby używać zmiennych łańcuchowych zapytania.

Jak powinienem to zrobić?

Czy istnieje bardziej elegancki sposób na rozwiązanie mojego problemu, tj. Przekazanie zmiennej, która w ogóle nie używa adresu URL?

Odpowiedz

12

Będziesz musiał ręcznie przeanalizować parametr URL w funkcjach routera.

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 do parsowania parametrów zapytania.

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

Będziesz oczywiście musiał przekonwertować funkcję JS na CS, ale masz pomysł.

+7

'unescape' w 2012 roku? Polecam pozostawienie 'escape' i' unescape' w śmietniku historii, 'encodeURIComponent' i [' decodeURIComponent'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/decodeURIComponent) są zwykle tym, co chcesz użyć. –

+1

To jeden problem. Trasy nie będą pasować do adresu URL zawierającego ciągi zapytań. Wyrażenie regularne powinno być używane do definiowania tras, które pozwalają na ciąg zapytania. – PreslavLe

+6

Znalazłem tę wtyczkę szkieletową, która robi dokładnie to, czego potrzebuję! https://github.com/jhudson8/backbone-query-parameters – PreslavLe

Powiązane problemy