我的应用程序中有一个端点,该端点根据给定的查询字符串返回数据。查询字符串可以(并且经常必须)包含重复的键,例如/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'}});


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

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

最佳答案

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

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


或者,您始终可以使用querystring参数设置这样的URL。

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


如果必须始终更改参数,则可以执行以下操作并直接使用它:

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


如果您有多个具体参数(意味着值有所变化,但键是静态的),并且每次获取时都会发生变化(即:搜索),则可以在Gist上签出分页实现,无论它对您有何用处。

希望这可以帮助。

09-11 20:33