2011-09-16 12 views
8

Anahtar değer çiftlerini paraşüt olarak Omurga rotalarına iletmek ve eşlenen işlev çağrılmadan önce bir javascript nesnesine serileştirilmesini istiyorum. Sonra, {: "VAL1", anahtar2: key1 dizesini "değer2"}: "anahtar1 = val1 & anahtar2 = VAL2 //...#dashboard http" Ben gittiğinizdeBackbone.js Yönlendiricisi'nde anahtar değer çifti param işlemlerini gerçekleştirme

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

üzerinde yazılı olmalıdır konsol.

Şu anda jQuery BBQ's $ .deparam yöntemini kullanarak seri hale getirilmiş nesneye ulaşmak için her eşlenen işlevi kullanıyorum. Yönlendiriciyi genişletip, bir kez tanımladığımda, parametreler bir nesne olarak tüm eşlenmiş işlevlerin içinde erişilebilir olduğunda çok güzel olurdu. Bunu yapmanın temiz bir yolu ne olurdu? Ve bunun içinde bazı tuzaklar var mı?

Çok teşekkürler, Sen Backbone.Router içinde _extractParameters işlevini yeniden tanımlamak gerekir

+1

Buna dikkat ederim. Tarayıcınızı karıştırabilecek bir URI oluşturuyorsunuz. # ve ? URI belirtiminde saklıdır ve? # önce bekleniyor. Bu bir sorun olmayabilir, ancak bu, farklı tarayıcılarda istenmeyen sonuçlara neden olabileceği anlamına geliyor. http://labs.apache.org/webarch/uri/rfc/rfc3986.html –

+0

@BrianGenisio Bilgi için teşekkürler. Şimdi çalışıyor ama dediğiniz gibi, tarayıcılar std'ye uymaya daha sonraki bir tarihte çalışmayı durdurabilir. :-) Alternatif bir yaklaşım deneyeceğim. –

+0

Neden sadece eğik çizgi kullanmıyorsunuz? –

cevap

10

mano. Daha sonra tüm yönlendirici işlevleri, ilk parametre params nesnesiyle çağrılacaktır.

// 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'); 

Çalışan demo, here'dur.