Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Backbone.js路由器中的键值对参数处理_Javascript_Backbone.js_Params_Query Parameters - Fatal编程技术网

Javascript Backbone.js路由器中的键值对参数处理

Javascript Backbone.js路由器中的键值对参数处理,javascript,backbone.js,params,query-parameters,Javascript,Backbone.js,Params,Query Parameters,我希望将键值对作为参数传递给主干路由,并希望在调用映射函数之前将其反序列化为javascript对象 var MyRouter = Backbone.Router.extend({ routes: { "dashboard?:params" : "show_dashboard" }, show_dashboard: function(params){ console.log(params); } }); 当我去http://...#dashboard?ke

我希望将键值对作为参数传递给主干路由,并希望在调用映射函数之前将其反序列化为javascript对象

var MyRouter = Backbone.Router.extend({
  routes: {
    "dashboard?:params" : "show_dashboard"
  },
  show_dashboard: function(params){
     console.log(params); 
  }
}); 
当我去http://...#dashboard?key1=val1&key2=val2,则应在控制台上打印{key1:“val1”,key2:“val2”}

我目前正在每个映射函数中使用jQuery BBQ的$.deparam方法来获取反序列化对象。若我能扩展路由器并定义它一次,那个就太好了,这样所有映射函数中的参数都可以作为对象访问。有什么干净的方法可以做到这一点?这里面有什么陷阱吗

非常感谢


mano

您应该在
主干网.路由器
中重新定义
提取参数
函数。然后调用所有路由器函数,第一个参数为
params
object

// Backbone Router with a custom parameter extractor
var Router = Backbone.Router.extend({
    routes: {
        'dashboard/:country/:city/?:params': 'whereAmIActually',
        'dashboard/?:params': 'whereAmI'
    },
    whereAmIActually: function(params, country, city){
        console.log('whereAmIActually');
        console.log(arguments);
    },
    whereAmI: function(params){
        console.log('whereAmI');
        console.log(arguments);
    },
    _extractParameters: function(route, fragment) {
        var result = route.exec(fragment).slice(1);
        result.unshift(deparam(result[result.length-1]));
        return result.slice(0,-1);
    }
});

// simplified $.deparam analog
var deparam = function(paramString){
    var result = {};
    if( ! paramString){
        return result;
    }
    $.each(paramString.split('&'), function(index, value){
        if(value){
            var param = value.split('=');
            result[param[0]] = param[1];
        }
    });
    return result;
};

var router = new Router;
Backbone.history.start();

// this call assumes that the url has been changed
Backbone.history.loadUrl('dashboard/?planet=earth&system=solar');
Backbone.history.loadUrl('dashboard/usa/la/?planet=earth&system=solar');

正在运行的演示是。

我会小心处理的。您正在生成一个可能会混淆浏览器的URI然后呢?在URI规范中被认为是保留的,并且?预计在#之前。这可能不是一个问题,但感觉可能会在不同的浏览器中造成意外的后果@谢谢你的信息。它现在可以工作,但正如您所说,它可能会在以后浏览器开始符合std时停止工作:-)将尝试另一种方法。@BrianGenisio我想您是建议我用a/替换#,并利用HTML5的pushState。我在某个地方读到,mobile safari在这方面有问题!现在我在片段中使用“=”作为分隔符,而不是“?”。所以,现在我用“http://...#dashboard=key1=val1&key2=val2并在反序列化前删除第一个“=”。同样,如何对所有路由功能只执行一次?谢谢。我只是建议你这样做:http://...#dashboard/key1=val1&key2=val2