Omurga kullanarak geçerli rotanın adını almam mümkün mü? Rota değişikliği olaylarına nasıl bağlanacağımı biliyorum, ancak mevcut rotayı diğer zamanlarda, değişiklikler arasında belirleyebilmek istiyorum.
Omurga kullanarak geçerli rotanın adını almam mümkün mü? Rota değişikliği olaylarına nasıl bağlanacağımı biliyorum, ancak mevcut rotayı diğer zamanlarda, değişiklikler arasında belirleyebilmek istiyorum.
Yanıtlar:
Uygulamanızda bir Yönlendirici başlattıysanız, aşağıdaki satır geçerli parçayı döndürür:
Backbone.history.getFragment();
Gönderen backbone.js belgelerinde :
"[...] Geçmiş, hashchange olaylarını veya pushState'i işlemek, uygun rotayı eşleştirmek ve geri çağrıları tetiklemek için global bir yönlendirici (kare başına) görevi görür. Bunlardan birini kendiniz oluşturmanız gerekmez - referansı kullanmalısınız Güzergahlar ile Yönlendiricilerden faydalanırsanız sizin için otomatik olarak oluşturulacak olan Backbone.history adresine gidin . [...] "
Bu parçaya bağlı işlevin adına ihtiyacınız varsa, Yönlendiricinizin kapsamı içinde böyle bir şey yapabilirsiniz:
alert( this.routes[Backbone.history.getFragment()] );
Veya yönlendiricinizin dışından bu şekilde:
alert( myRouter.routes[Backbone.history.getFragment()] );
Backbone.history.getFragment()
, çünkü Backbone.history.fragment
gizli bir özelliktir.
Robert'ın cevabı ilginç, ama ne yazık ki sadece karma tam olarak rotada tanımlandığı gibi çalışacak. Örneğin, bir rotanız user(/:uid)
varsa, ya ( Backbone.history.fragment
ya "user"
da "user/1"
her ikisi de bu rota için en belirgin iki kullanım örneğidir ) eşleşmez. Başka bir deyişle, yalnızca karma tamsa "user(/:uid)"
(çok düşük olasılıkla) uygun geri arama adını bulur .
Bu işlevselliğe ihtiyaç duyduğumdan , Tarih ve Yönlendirici nesnesinin geçerli parçayı uygun geri çağırma için tetiklenen tanımlı Rotalara karşı eşleştirmek için kullandığı kodun bir kısmını yeniden kullanan Backbone.Router
bir current
-fonksiyonu ile genişletilmiş . Kullanım durumum için, route
doğru olan herhangi bir şeye ayarlanırsa, rota için tanımlanan ilgili işlev adını döndürecek olan isteğe bağlı parametreyi alır . Aksi takdirde mevcut karma parçasını döndürür Backbone.History.fragment
.
Kodu, Omurga yönlendiricisini başlattığınız ve ayarladığınız mevcut Extend'inize ekleyebilirsiniz.
var Router = new Backbone.Router.extend({
// Pretty basic stuff
routes : {
"home" : "home",
"user(:/uid)" : "user",
"test" : "completelyDifferent"
},
home : function() {
// Home route
},
user : function(uid) {
// User route
},
// Gets the current route callback function name
// or current hash fragment
current : function(route){
if(route && Backbone.History.started) {
var Router = this,
// Get current fragment from Backbone.History
fragment = Backbone.history.fragment,
// Get current object of routes and convert to array-pairs
routes = _.pairs(Router.routes);
// Loop through array pairs and return
// array on first truthful match.
var matched = _.find(routes, function(handler) {
var route = handler[0];
// Convert the route to RegExp using the
// Backbone Router's internal convert
// function (if it already isn't a RegExp)
route = _.isRegExp(route) ? route : Router._routeToRegExp(route);
// Test the regexp against the current fragment
return route.test(fragment);
});
// Returns callback name or false if
// no matches are found
return matched ? matched[1] : false;
} else {
// Just return current hash fragment in History
return Backbone.history.fragment
}
}
});
// Example uses:
// Location: /home
// console.log(Router.current()) // Outputs 'home'
// Location: /user/1
// console.log(Router.current(true)) // Outputs 'user'
// Location: /user/2
// console.log(Router.current()) // Outputs 'user/2'
// Location: /test
// console.log(Router.current(true)) // Outputs 'completelyDifferent'
Eminim bazı iyileştirmeler yapılabilir, ancak bu, başlamanız için iyi bir yoldur. Ayrıca, Route nesnesini genişletmeden bu işlevselliği oluşturmak kolaydır. Bunu yaptım çünkü kurulumum için en uygun yol buydu.
Bunu henüz tam olarak test etmedim, bu yüzden bir şey güneye giderse lütfen bana bildirin.
İşlevde bazı değişiklikler yaptım, bu yüzden karma veya rota geri arama adı döndürmek yerine, rotadan alacağınız gibi geçerli rotadaki tüm verilere erişebilmeniz için parça, params ve rota içeren bir nesne döndürüyorum. Etkinlik.
Aşağıdaki değişiklikleri görebilirsiniz:
current : function() {
var Router = this,
fragment = Backbone.history.fragment,
routes = _.pairs(Router.routes),
route = null, params = null, matched;
matched = _.find(routes, function(handler) {
route = _.isRegExp(handler[0]) ? handler[0] : Router._routeToRegExp(handler[0]);
return route.test(fragment);
});
if(matched) {
// NEW: Extracts the params using the internal
// function _extractParameters
params = Router._extractParameters(route, fragment);
route = matched[1];
}
return {
route : route,
fragment : fragment,
params : params
};
}
Daha fazla yorum ve açıklama için önceki koda bakın, çoğunlukla aynı görünüyorlar.
_.find
olarak this
, işlevin üçüncü parametresini (bağlamı ayarlar) olarak ayarlayabilirsiniz , böylece Router
değişken gereksinimini ortadan kaldırırsınız (@DanAbramov bunu zaten yaptı).
Marionette.AppRouter
yukarıdaki fonksiyonu, ancak yerine ile yönlendirici uzatmak Router.appRoutes
için Router.routes
.
Yönlendirici için kök ayarını kullanırsanız, 'gerçek' parçayı almak için bunu da ekleyebilirsiniz.
(Backbone.history.options.root || "") + "/" + Backbone.history.fragment
İşte Simon'un cevabının biraz daha ayrıntılı (veya zevkinize bağlı olarak daha okunabilir) versiyonu :
current: function () {
var fragment = Backbone.history.fragment,
routes = _.pairs(this.routes),
route,
name,
found;
found = _.find(routes, function (namedRoute) {
route = namedRoute[0];
name = namedRoute[1];
if (!_.isRegExp(route)) {
route = this._routeToRegExp(route);
}
return route.test(fragment);
}, this);
if (found) {
return {
name: name,
params: this._extractParameters(route, fragment),
fragment: fragment
};
}
}
Kaynağına bakarsanız Router
, yönlendirici bir şeyin değiştiğini söyleyerek olayı tetiklediğinde, adı "route: name" olarak geçirdiğini görürsünüz.
http://documentcloud.github.com/backbone/docs/backbone.html#section-84
"Rota" olayını her zaman yönlendiriciye bağlayabilir ve geçerli rotayı almak için saklayabilirsiniz.
route
eğer olay trigger
değil true
(önerilir & varsayılan).