我有一个过滤功能,很多复选框和下拉菜单。当用户选中多个复选框并选择下拉值时,他们会点击“立即过滤”按钮。
该按钮然后对我的API执行POST请求,并将过滤选项作为参数传递,并从MongoDB返回数据。
继承我的代码:
factory.getFilteredProjects = function(regions, services, sector){
return $http.post('/user/test',{
region: regions,
sol: services,
sec: sector
}).
success(function(data, status, headers, config) {
// this callback will be called asynchronously
// when the response is available
console.log("this is the response data " + data);
}).
error(function(data, status, headers, config) {
// called asynchronously if an error occurs
// or server returns response with an error status.
});
};
return factory;
});
在上面的代码中,您可以看到我有 3个参数 (区域,服务,部门)
现在,用户可能只希望通过以下方式过滤数据:
答案 0 :(得分:1)
你可以用参数而不是三个字符串给出一个对象。像这样你可以控制POST参数的数量,而不是一些未定义。
编辑:我建议您在服务中进行过滤。像这样,您不必在每个控制器上复杂化代码:
public class SetterInterceptor {
@RuntimeType
public Object intercept() {
System.out.println("Invoked method with: ");
return null;
}
}
答案 1 :(得分:0)
所以在做了一些研究之后,几杯咖啡和几个发誓的话后来我开始工作了。
但是还有一张纸条:
首先感谢 Yoann Prot ,您的建议是一个巨大的帮助!
这是我最初的解决方案,我不会接受自己的答案。因为可能有更好的解决方案,如果他们认为可以改进,我希望有人发表答案/评论
所以,如果您阅读上述评论,我知道我的API能够处理多个或灵活的数字参数。问题是我的HTTP Post功能要求所有参数都存在。
Alex Blex 在评论中建议:
然后,您只需要检测用户实际交互的内容,并仅发送它们
这就是我所做的。
我创建了一个过滤器对象,我只添加了用户与之交互的选项的键/值对,并将整个过滤器对象作为参数传递。这使我对HTTP Post请求的参数更加灵活。
下面是代码:
var filterObj = {};
var form = document.getElementById("regionPicker");
var servicesForm = document.getElementById("servicesPicker");
var inputs = form.getElementsByTagName("input");
var arr = [];
var servicesInput = servicesForm.getElementsByTagName("input");
var servicesArr = [];
for (var i = 0; i < inputs.length; i += 1) {
// Take only those inputs which are checkbox
if (inputs[i].type === "checkbox" && inputs[i].checked) {
arr.push(inputs[i].value);
}
}
for (var i = 0; i < servicesInput.length; i += 1) {
// Take only those inputs which are checkbox
if (servicesInput[i].type === "checkbox" && servicesInput[i].checked) {
servicesArr.push(servicesInput[i].value);
}
}
// here arr contains an array of filter options selected by user
filterObj.region = (arr.length > 0) ? arr:"";
// here serviceArr contains an array of another filter options selected by user
filterObj.sol = (servicesArr.length > 0) ? servicesArr:"";
最后将filterObj作为参数传递:
factory.getFilteredProjects = function(filterObj){
return $http.post('/user/test',filterObj)
.success(function(data, status, headers, config) {
console.log("this is the response data " + data.length);
})
.error(function(data, status, headers, config) {
// called asynchronously if an error occurs
// or server returns response with an error status.
});
};
到目前为止,所有测试都取得了成功。但我再说一遍,如果你知道一个更好的解决方案请告诉我,或者如果你认为这个解决方案有缺点或问题,或者只是不好的做法,请告诉我。
谢谢!