backbone.js - navigate - backbone software
navegar por la ruta con querystring (5)
Will Backbone.Router.navigate
set test
en 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);
Por ejemplo, posts?foo=3
fragmento posts?foo=3
coincidirá con la ruta de las posts
de manera predeterminada, o tengo que establecer otra ruta para eso, por ejemplo: posts?*querystring
?
Gracias
PD: Sé que existen los backbone-query-parameters pero quiero saber solo para la red troncal.
Aquí hay otra toma, todavía usando lodash (guión bajo). Se eliminó el _.map, se agregó un poco de verbosidad a las variables y se eliminó el ''?'' Inicial. si está presente:
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
}
Documentos de Backbone:
Las rutas pueden contener partes de parámetros,: param, que coinciden con un único componente de URL entre barras diagonales; y splat parts * splat, que puede coincidir con cualquier cantidad de componentes de URL.
Si aún desea mantener la funcionalidad sin la coincidencia, puede definir dos rutas
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)
}
Necesita agregar otra ruta con ese parámetro de espera:
routes: {
''posts?foo=:foo'' : ''showPosts'',
''posts'': ''showPosts''
},
showPosts: function (foo) {
if(typeof foo != ''undefined''){
// foo parameters was passed
}
test = true;
}
actualizar
Puede definir la ruta general para devolver toda la cadena de consulta y luego analizarla en el controlador:
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;
}
actualización 2
Aquí hay una demostración en vivo para ver el código en acción.
RFC 3986 "sintaxis para URI" establece que los parámetros de consulta se dividen antes del fragmento hash.
En los URI, un hashmark # introduce el fragmento opcional cerca del final de la URL. La sintaxis genérica RFC 3986 para URI también permite una parte de consulta opcional introducida por un signo de interrogación?. En los URI con una consulta y un fragmento, el fragmento sigue a la consulta.
Tengo este problema manejando una redirección que obtengo del servidor, es decir, " http://foo.com/main.html?error=errormessage#site ". Me gustaría enrutar la consulta, pero no puedo ver una forma de escribir la expresión de la ruta de la red troncal para manejar esta url. Por ahora acabo de enrutar el hash y comprobar si hay una consulta al analizar location.search.
Solo para complementar las respuestas anteriores, en lugar de definir dos rutas que tienen la misma devolución de llamada, como:
routes: {
''posts'': ''showPosts'',
''posts?*querystring'': ''showPosts''
}
Podría tener solo una ruta para mantener el código más limpio:
routes: {
''posts(?*querystring)'': ''showPosts''
}