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.
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.
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'
}
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)
}
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
}
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.