webentwicklung-frage-antwort-db.com.de

navigiere die Route mit Querystring

Wille Backbone.Router.navigate setze test auf 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);

ZB wird posts?foo=3 Fragment entspricht standardmäßig der posts Route, oder muss ich dafür eine andere Route festlegen, zum Beispiel: posts?*querystring?

Vielen Dank

PS: Ich weiß, es existiert die Backbone-Abfrage-Parameter aber ich mag nur für Rückgrat kennen.

36
abernier

Sie müssen eine weitere Route mit diesem erwarteten Parameter hinzufügen:

routes: {
    'posts?foo=:foo' : 'showPosts',
    'posts': 'showPosts'
},
showPosts: function (foo) {
    if(typeof foo != 'undefined'){
       // foo parameters was passed
    }
    test = true;
}

update
Sie können die allgemeine Route definieren, um die gesamte Abfragezeichenfolge zurückzugeben, und sie dann im Handler analysieren:

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;
}

Update 2

Hier ist eine Live-Demo um den Code in Aktion zu sehen.

66
gion_13

Nur um die vorherigen Antworten zu ergänzen, anstatt zwei Routen zu definieren, die denselben Rückruf haben, wie:

routes: {
    'posts': 'showPosts',
    'posts?*querystring': 'showPosts'
}

Sie könnten nur eine Route haben, um den Code sauberer zu halten:

routes: {
    'posts(?*querystring)': 'showPosts'
}
18
romaia

Backbone-Dokumente:

Routen können Parameter Teile enthalten,: param, die eine einzelne URL Komponente zwischen Schrägstriche entsprechen; und splat parts * splat, die mit einer beliebigen Anzahl von URL-Komponenten übereinstimmen können.

Wenn Sie die Funktionalität auch ohne den Abgleich beibehalten möchten, können Sie zwei Routen definieren

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)      
}
6
jakee

Hier ist eine weitere Einstellung, die noch lodash (Unterstrich) verwendet. Entfernte die _.map, fügte den Variablen ein wenig Ausführlichkeit hinzu und streifte das anfängliche '?' Falls vorhanden:

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
}
5
blented

RFC 3986 "Syntax für URIs" besagt, dass Abfrageparameter vor dem Hash-Fragment stehen sollen.

In URIs führt ein Hashmark # das optionale Fragment am Ende der URL ein. Die generische RFC 3986-Syntax für URIs ermöglicht auch einen optionalen Abfrageteil, der durch ein Fragezeichen? Eingeleitet wird. In URIs mit einer Abfrage und einem Fragment folgt das Fragment der Abfrage.

Ich habe dieses Problem bei der Behandlung einer Weiterleitung, die ich vom Server erhalte, d. H. " http://foo.com/main.html?error=errormessage#site ". Ich möchte die Abfrage weiterleiten, kann jedoch keinen Weg finden, den Backbone-Routenausdruck für diese URL zu schreiben. Im Moment route ich einfach den Hash und überprüfe auf eine Abfrage, indem ich location.search analysiere.

1
Chris Collins