3

我注意到一些网站提供 Ajax-ian 搜索来刷新 URL 并显示使用的 GET 参数,例如:

someapp.com/search/Tokyo?price_min=80&price_max=300

作为 Ajax GET 请求的结果。

我想知道如何通过使用Backbone.js来实现这一点,我知道通过使用主干的推送状态这可能是可能的,对吗?

例如,我如何为 Place 模型定义这样的路线(假设相同的情况,范围为 /search)?

我会在哪里做这个?在路由器或模型中?

我感谢有关此主题的所有答案。我提前为没有提供任何代码道歉,我通常这样做,但这个练习将是我想做的概念证明,我希望骨干是这项工作的正确工具。

谢谢!

4

1 回答 1

5

这是解决方案的一个工作示例 - 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,但它尚未普及。

于 2012-08-12T21:57:11.397 回答