如何将查询字符串传递给backbone.js路由

时间:2012-04-01 18:18:17

标签: backbone.js query-string url-routing

我正在使用Backbone.js和jQuery-mobile。 jQuery-mobile routing被禁用,我只使用lib进行UI。除了选择页面转换外,我完成了所有工作。我需要将页面转换('slice-up','fade','slide-down')传递给Backbone路由器,因为转换是根据用户来自何处而变化的。

我认为这是一种非常难看的方式,通过网址传递它们:

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)

以下是默认转换的html链接:

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

以下是淡入淡出过渡的html链接:

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

使用查询字符串,即/ food / new?transition ='fade'肯定更好,但我不知道如何定义骨干路由以使用查询字符串变量。

我该怎么做?

是否有一种更优雅的方式来处理我的问题,即根本不使用url传递变量?

1 个答案:

答案 0 :(得分:12)

您必须手动解析路由器功能中的URL参数。

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来解析查询参数。

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

你当然必须将JS功能转换为CS,但你明白了。