【问题标题】:Backbone.js populating a collection with fetch and data -- how to pass duplicate keys?Backbone.js 用 fetch 和 data 填充集合——如何传递重复的键?
【发布时间】:2013-01-15 20:39:56
【问题描述】:

我的应用程序中有一个端点,它根据给定的查询字符串返回数据。查询字符串可以(并且经常必须)包含重复的键,例如/api/entities/related?filter1=val1&filter1=val2&filter2=val3 来识别filter1 类型的两个过滤器。 Flask 很好地处理了这个问题,例如在执行request.args.to_dict 时,我会得到{'filter1': ['val1', 'val2'], 'filter2': 'val3'}。

我的问题是如何在从端点获取集合时使用 Backbone 实现相同的功能。目前我可能有

this.fetch({data: {'filter1': 'val1', 'filter1': 'val2', 'filter2': 'val3'}});

由于重复键会在 javascript 对象中相互覆盖,我的 filter1 值最终将是 val2。但是,当做

this.fetch({data: {'filter1': ['val1', 'val2'], 'filter2': 'val3'}});

url 最终是/api/entities/related?filter1%5B%5D=val1&filter1%5B%5D=val2,它至少使用了两个相同的键,但显然不起作用。

这是一个编码问题还是我应该以不同的方式处理它?

【问题讨论】:

  • 您应该使用json有效负载与您的端点通信,即在必要时使用带有json主体的POST请求,而不是处理查询字符串中混乱的url编码,越简单越好。跨度>
  • 我相信这是在 url 中编码数组的标准方法,它会解码回:decodeURIComponent($.param({filter1: ['val1', 'val2']})); // outputs: "filter1[]=val1&filter1[]=val2"。我找不到太多关于此的文档,但这个 SO 响应同意(另外,我相信 jQuery 的 $.param()):stackoverflow.com/questions/40568/square-brackets-in-urls/…

标签: url backbone.js encoding query-string flask


【解决方案1】:

您可以使用 Array 作为值传递带有重复键的查询字符串。

this.fetch({ data: $.param({ filter1: ['value1','value2']}) });

或者,您可以随时使用查询字符串参数设置这样的 URL。

var MyModel = Backbone.Model.extend({
  "url": function() {
      return '/' + encodeURI('?filter1=' + val1 + '&filter1=' + val2);
  }
});

如果您必须一直更改参数,您可以执行类似的操作并直接使用它:

this.model.destroy({
    url: '/' + encodeURI('?filter1=' + val1 + '&filter1=' + val2)              
});

如果您有多个具体参数(意味着值更改但键是静态的)每次获取都会更改(即:搜索),您可以查看Gist 上的分页实现,无论它可能对您的情况有用可能是。

希望这会有所帮助。

【讨论】:

  • 谢谢——我确实尝试过使用 $.param(),但这仍然会导致相同的奇怪 url。您的第二个建议是我最初所做的,但我有时不得不使用不同的参数重新获取数据,并且每次都更新 url 没有意义。
  • 更改并测试了上面的第一个代码,为一个键传递多个值。查看我的更新回复。
【解决方案2】:

感谢大家的意见。

显然,您传递的数据不一定是对象——我发现在我的例子中,最简单的方法是将字符串 ('filter1=val1&filter2=val2') 传递给 fetch() 并且效果很好。

【讨论】:

  • 您的服务器框架应该(反)序列化类似 ?filter[]=a&filter[]=b 的东西到字典/散列中,以 'filter' 作为键, ['a', 'b' ] 作为值。它可能取决于您的服务器框架,语法是什么样的。我提供的示例适用于 Rails
猜你喜欢
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-16
相关资源
最近更新 更多