Question

Volonté Backbone.Router.navigate ensemble test à 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, est-ce que posts?foo=3 le fragment correspondra au posts route par défaut, ou dois-je définir une autre route pour cela, par exemple : posts?*querystring?

Merci

PS :Je sais qu'il existe le paramètres de requête de base mais je veux savoir juste pour la colonne vertébrale.

Était-ce utile?

La solution

Vous devez ajouter une autre route avec ce paramètre d'attente :

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 la route générale 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 une démo en direct pour voir le code en action.

Autres conseils

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'une seule route 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 d'URL entre des barres obliques ;et les parties splat *splat, qui peuvent correspondre à n'importe quel nombre de composants d'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 (trait de soulignement).Supprimé le _.map, ajouté un peu de verbosité aux variables et éliminer le démarrage «? 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 « syntaxe des URI » de la RFC 3986 indique que les paramètres de requête doivent précéder le fragment de hachage.

Dans les URI, un hashtag # introduit le fragment facultatif vers la fin de l'URL.La syntaxe générique RFC 3986 pour les URI autorise é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 avec la gestion d'une redirection que je reçois du serveur, c'est-à-dire"http://foo.com/main.html?error=errormessage#site".Je voudrais acheminer la requête, mais je ne vois pas de moyen d'écrire l'expression de route principale pour gérer cette URL.Pour l'instant, je parcours simplement le hachage et vérifie une requête en analysant location.search.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top