我正在我的 Angular Web App 中使用 Azure Mobile Services Library for Javascipt。根据这里的文档:https://github.com/Azure/azure-mobile-services/blob/master/docs/mobile-services-html-how-to-use-client-library.md#how-to-filter-returned-data
有两种方法可以筛选返回的数据。一个是传递 JSON 对象,另一个是传递过滤器函数(用于复杂过滤(。我正在使用过滤器函数,因为我必须对 startDate 或 endDate 等需要大于或小于条件的列使用关系运算符。
我有一个函数,如下所示,它基于前端设置的某些过滤器返回一个过滤器函数,但为了迎合不同的过滤器,我必须使用很多 if..else 条件以查看设置了其中的哪个以及要返回的过滤器函数。
function getFilterFunc() {
if (x != null) {
if (y != null) {
return function () { return this.id == xyz && this.x == x && this.y == y; };
} else {
return function () { return this.id == xyz && this.x == x; };
}
}
.
.
.
else {
return function () { return this.id == xyz; };
}
}
它一直这样持续下去,我希望你明白这个想法。
我想知道的是是否有更好的方法来生成此过滤器函数。如果可以使用,只需遍历所有过滤器,并简单地将条件连接到设置的过滤器的单个 return 语句上。完成所有筛选器后,我们将语句作为函数返回,并将其用作 Azure 移动服务的筛选器函数。
实际上,filter 函数的主体被转换为传递给查询字符串参数的开放数据协议 (OData( 布尔表达式。但是,可以直接将 OData 查询字符串传递给read
方法,并生成 OData 查询字符串,如下所示:
var filterStr = "$filter=id eq 'xyz'";
if(x) filterStr += " and x eq '" + x + "'";
if(y) filterStr += " and y eq '" + y + "'";
.
.
.
table.read(encodeURIComponent(filterStr)).then(success, failure);
有关详细信息,请参阅执行 OData 查询操作。