2011-09-16 8 views
8

キー値のペアをバックボーンルートにパラメータとして渡し、マップされた関数が呼び出される前にjavascriptオブジェクトにデシリアライズしたいとします。そして、{: "VAL1"、KEY2:KEY1 "とval2を"}: "?キー1 = val1と&キー2 = val2のを//...#dashboardのhttp" 私がに行くときBackbone.jsのキー値ペアのパラメータ処理ルータ

var MyRouter = Backbone.Router.extend({ 
    routes: { 
    "dashboard?:params" : "show_dashboard" 
    }, 
    show_dashboard: function(params){ 
    console.log(params); 
    } 
}); 

に印刷する必要がありますコンソール。

現在、マップされた各関数内でjQuery BBQの$ .deparamメソッドを使用して、逆シリアル化されたオブジェクトを取得しています。ルータを拡張して一度だけ定義することができれば、paramsはオブジェクトとしてマップされたすべての関数の中でアクセス可能です。これを行うためのきれいな方法は何でしょうか?そして、そこにいくつかの落とし穴がありますか?

多くのおかげで、

真野

+1

私はこれに注意します。あなたのブラウザを混乱させるかもしれないURIを生成しています。 #と? URI仕様で予約されていると見なされますか? #の前に期待されます。これは問題ではないかもしれませんが、ブラウザごとに意図しない結果を引き起こす可能性があります。 http://labs.apache.org/webarch/uri/rfc/rfc3986.html –

+0

@BrianGenisio情報をありがとう。今は動作しますが、あなたが言うように、ブラウザが標準に準拠し始めると、後日作業を停止する可能性があります:-)別のアプローチを試みます。 –

+0

なぜスラッシュを使用しないのですか? –

答えて

10

あなたはBackbone.Router_extractParameters機能を再定義する必要があります。その後、すべてのルータ機能が呼び出され、最初のパラメータはparamsオブジェクトになります。

// Backbone Router with a custom parameter extractor 
var Router = Backbone.Router.extend({ 
    routes: { 
     'dashboard/:country/:city/?:params': 'whereAmIActually', 
     'dashboard/?:params': 'whereAmI' 
    }, 
    whereAmIActually: function(params, country, city){ 
     console.log('whereAmIActually'); 
     console.log(arguments); 
    }, 
    whereAmI: function(params){ 
     console.log('whereAmI'); 
     console.log(arguments); 
    }, 
    _extractParameters: function(route, fragment) { 
     var result = route.exec(fragment).slice(1); 
     result.unshift(deparam(result[result.length-1])); 
     return result.slice(0,-1); 
    } 
}); 

// simplified $.deparam analog 
var deparam = function(paramString){ 
    var result = {}; 
    if(! paramString){ 
     return result; 
    } 
    $.each(paramString.split('&'), function(index, value){ 
     if(value){ 
      var param = value.split('='); 
      result[param[0]] = param[1]; 
     } 
    }); 
    return result; 
}; 

var router = new Router; 
Backbone.history.start(); 

// this call assumes that the url has been changed 
Backbone.history.loadUrl('dashboard/?planet=earth&system=solar'); 
Backbone.history.loadUrl('dashboard/usa/la/?planet=earth&system=solar'); 

作業デモはhereです。

関連する問題