这是解决方案的一个工作示例 - jsfiddle.net/avrelian/dGr8Y/,除了 jsFiddle 不允许Backbone.history.navigate
方法正常运行。
假设,我们有一个按钮
<input class="fetch-button" type="button" value="Fetch" />
和一个处理程序
$('.fetch-button').click(function() {
Backbone.history.navigate('posts/?author=martin', true);
});
这是我们收集的帖子
var Posts = Backbone.Collection.extend({
url: 'api/posts'
});
这是我们的带有自定义参数提取器的路由器
var Router = Backbone.Router.extend({
routes: {
'posts/?:filters': 'filterPosts'
},
filterPosts: function(filters){
posts.fetch({data: $.param(filters)});
},
_extractParameters: function(route, fragment) {
var result = route.exec(fragment).slice(1);
result.unshift(deparam(result[result.length-1]));
return result.slice(0,-1);
}
});
它是简化的 $.deparam 模拟。你可以用你自己的来代替。
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 posts = new Posts;
var router = new Router;
Backbone.history.start();
当用户点击按钮时,地址栏变为myapp.com/s/#posts?author=martin
. 请注意标志#
。我们使用哈希查询字符串。当然,您可以使用push state
,但它尚未普及。