Volonté Backbone.Router.navigate
définissez test
sur true
:
var test = false;
var Router = Backbone.Router.extend({
routes: {
'posts': 'showPosts'
},
showPosts: function () {
test = true;
}
});
router = new Router();
Backbone.history.start();
router.navigate('posts?foo=3', {trigger: true});
assert.ok(test);
Par exemple, sera posts?foo=3
fragment correspondra à la route posts
par défaut, ou dois-je définir une autre route pour cela, par exemple: posts?*querystring
?
Je vous remercie
PS: Je sais qu'il existe backbone-query-parameters mais je veux savoir juste pour le backbone.
Vous devez ajouter une autre route avec ce paramètre attendu:
routes: {
'posts?foo=:foo' : 'showPosts',
'posts': 'showPosts'
},
showPosts: function (foo) {
if(typeof foo != 'undefined'){
// foo parameters was passed
}
test = true;
}
mise à jour
Vous pouvez définir l'itinéraire général pour renvoyer toute la chaîne de requête, puis l'analyser dans le gestionnaire:
routes: {
'posts': 'showPosts',
'posts?*queryString' : 'showPosts'
},
showPosts: function (queryString) {
var params = parseQueryString(queryString);
if(params.foo){
// foo parameters was passed
}
}
...
// and the function that parses the query string can be something like :
function parseQueryString(queryString){
var params = {};
if(queryString){
_.each(
_.map(decodeURI(queryString).split(/&/g),function(el,i){
var aux = el.split('='), o = {};
if(aux.length >= 1){
var val = undefined;
if(aux.length == 2)
val = aux[1];
o[aux[0]] = val;
}
return o;
}),
function(o){
_.extend(params,o);
}
);
}
return params;
}
mise à jour 2
Voici ne démo en direct pour voir le code en action.
Juste pour compléter les réponses précédentes, au lieu de définir deux routes qui ont le même rappel, comme:
routes: {
'posts': 'showPosts',
'posts?*querystring': 'showPosts'
}
Vous ne pouvez avoir qu'un seul itinéraire pour garder le code plus propre:
routes: {
'posts(?*querystring)': 'showPosts'
}
Documents de base:
Les routes peuvent contenir des parties de paramètres,: param, qui correspondent à un seul composant URL entre les barres obliques; et splat parts * splat, qui peut correspondre à n'importe quel nombre de composants URL.
Si vous souhaitez toujours conserver la fonctionnalité sans la correspondance, vous pouvez définir deux itinéraires
routes: {
'posts': 'showPosts',
'posts?*querystring': 'showPosts'
}
showPosts: function(querystring) {
if (querystring) {
// here you can parse your querystring, for your case the querystring variable is
// 'foo=3'
}
//here you'll show posts according to the querystring (or lack thereof)
}
Voici une autre prise, toujours en utilisant lodash (souligné). Suppression du _.map, ajout d'un peu de verbosité aux variables et suppression du "?" De départ si présent:
function parseQueryString(queryString)
{
if (!_.isString(queryString))
return
queryString = queryString.substring( queryString.indexOf('?') + 1 )
var params = {}
var queryParts = decodeURI(queryString).split(/&/g)
_.each(queryParts, function(val)
{
var parts = val.split('=')
if (parts.length >= 1)
{
var val = undefined
if (parts.length == 2)
val = parts[1]
params[parts[0]] = val
}
})
return params
}
La RFC 3986 "syntaxe pour les URI" indique que les paramètres de requête doivent précéder le fragment de hachage.
Dans les URI, un hachage # introduit le fragment facultatif vers la fin de l'URL. La syntaxe générique RFC 3986 pour les URI permet également une partie de requête facultative introduite par un point d'interrogation?. Dans les URI avec une requête et un fragment, le fragment suit la requête.
J'ai ce problème en gérant une redirection que je reçois du serveur, c'est-à-dire " http://foo.com/main.html?error=errormessage#site ". Je voudrais router sur la requête, mais je ne vois pas de moyen d'écrire l'expression de la route de base pour gérer cette URL. Pour l'instant, je route simplement sur le hachage et vérifie une requête en analysant location.search.