我的应用程序中有一个端点,该端点根据给定的查询字符串返回数据。查询字符串可以(并且经常必须)包含重复的键,例如/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上签出分页实现,无论它对您有何用处。
希望这可以帮助。