La réponse de Robert est intéressante, mais malheureusement elle ne fonctionnera que si le hachage est exactement comme défini dans l'itinéraire. Si, par exemple, vous avez une route pour user(/:uid)
elle ne sera pas mise en correspondance si le Backbone.history.fragment
est l'un "user"
ou l' autre "user/1"
(qui sont les deux cas d'utilisation les plus évidents pour une telle route). En d'autres termes, il ne trouvera le nom de rappel approprié que si le hachage est exactement "user(/:uid)"
(hautement improbable).
Comme j'avais besoin de cette fonctionnalité, j'ai étendu le Backbone.Router
avec une current
fonction qui réutilise une partie du code utilisé par l'objet History et Router pour faire correspondre le fragment actuel aux routes définies pour déclencher le rappel approprié. Pour mon cas d'utilisation, il prend le paramètre facultatif route
, qui, s'il est défini sur quelque chose de véridique, renverra le nom de fonction correspondant défini pour l'itinéraire. Sinon, il retournera le fragment de hachage actuel de Backbone.History.fragment
.
Vous pouvez ajouter le code à votre extension existante où vous initialisez et configurez le routeur Backbone.
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'
Je suis sûr que certaines améliorations pourraient être apportées, mais c'est un bon moyen de vous lancer. En outre, il est facile de créer cette fonctionnalité sans étendre l'objet Route. Je l'ai fait parce que c'était le moyen le plus pratique pour ma configuration.
Je n'ai pas encore testé cela complètement, alors faites-moi savoir si quelque chose va au sud.
MISE À JOUR 25/04/2013
J'ai apporté quelques modifications à la fonction, donc au lieu de renvoyer le hachage ou le nom de rappel de la route, je renvoie un objet avec un fragment, des paramètres et une route afin que vous puissiez accéder à toutes les données de la route actuelle, un peu comme vous le feriez de la route- un événement.
Vous pouvez voir les changements ci-dessous:
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
};
}
Voir le code précédent pour plus de commentaires et d'explications, ils se ressemblent pour la plupart.