【问题标题】:How can I create custom GET urls with params using Backbone?如何使用 Backbone 创建带有参数的自定义 GET url?
【发布时间】:2012-08-11 21:09:18
【问题描述】:

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

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

作为 Ajax GET 请求的结果。

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

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

我会在哪里做呢?在路由器中还是在模型中?

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

谢谢!

【问题讨论】:

  • 谢谢,看起来很有趣,我去看看,你觉得这个答案怎么样:stackoverflow.com/questions/6659283/…
  • 我觉得从路由器开始比较好。您导航(以编程方式或从地址栏)到someapp.com/search/Tokyo?price_min=80&price_max=300,路由器解析您的参数,并通过collection.fetch({ data: $.param({ price_min: 80, price_max: 300}) }); 或通过您的集合的自定义sync 方法使用这些参数获取您的集合。当然,你可以用相反的方式来做,但在这种情况下,处理书签链接会很困难。
  • 首先感谢您的帮助!我想澄清一下,我正在做的是通过单击按钮来获取集合,即。 @collection.fetch({data: {author: 'author'}}),这很好用,但我的最终目标是:在浏览器中显示 GET URL,例如:myapp.com/s/posts?author=author 显示在浏览器 URL 框中,而不仅仅是在内部。我该怎么做?

标签: backbone.js


【解决方案1】:

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

【讨论】:

  • 是的!看来是我需要的了,太棒了,非常感谢!让我研究一下。似乎导航方法可以解决问题,对吧?
  • 这个练习很清楚它的作用,但是,我确实有一个问题,路由器的'_extractParameters'方法在什么时候被调用? (我知道有人会解析 GET url 参数,对吗?)再次感谢!
  • Router的_bindRoutes方法是从Router的构造函数中调用的。它为Router的每条路由调用route方法。此方法使用特殊回调调用 Backbone.history.route 方法,该回调应在调用时调用 _extractParameters 方法。此回调将添加到Backbone.Historyhandlers 数组中。
  • 然后,当用户导航到路由器路由中指定的地址时,或者以编程方式调用 navigate 方法(如您的示例)时,Backbone.HistoryloadUrl 方法叫做。在这个方法中,Backbone 正在选择和调用适当的处理程序,正如您已经猜到的那样,它是带有 _extractParameters 方法调用的特殊回调。
  • 太棒了!毫无疑问,你帮了我很多!谢谢,我当然会接受你的回答,但是,我想问你一些别的问题:为什么这些(回调)方法没有显示在backbonejs.org 文档中?我很困惑。而且在其他任何地方都不容易找到有关它们的文档。
猜你喜欢
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
  • 2012-10-01
相关资源
最近更新 更多