2

我的应用程序中有一个端点,它根据给定的查询字符串返回数据。查询字符串可以(并且经常必须)包含重复的键,例如/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,它至少确实使用了两个相同的键,但显然不起作用。

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

4

2 回答 2

1

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

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上的分页实现,无论它可能对您的情况有用。

希望这可以帮助。

于 2013-01-31T17:35:40.593 回答
0

感谢大家的意见。

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

于 2013-02-01T10:26:34.100 回答