google-app-maker - 数据源分页问题(再次修订)
问题描述
有关原始问题,请参阅数据源分页问题(修订版) 。
Markus,您很友好地帮助解决了使用计算数据源将记录计数合并到查询中的问题。我有一个包含 15 个小部件的搜索表单 - 混合了日期范围、下拉列表、文本值和 ._contains、._equals、._greaterThanOrEquals、._lessThanOrEquals 等。
我已经针对 mySQL SQL 代码对此进行了广泛的测试,并且效果很好。
我现在添加了第 16 个参数 PropertyNames,它是一个带有绑定 @datasource.query.filters.Property.PropertyName._in 和 Options 空白的列表。表单上的小部件是隐藏的,因为它仅用于额外的过滤。
使用如下逻辑,使得特定登录用户只能查看自己的属性。因此,如果他们执行搜索并且未指定属性,我们会:-
if (params.param_Property === null && canViewAllRecords === false) {
console.log(params.param_PropertyNames); // correct output
ds.filters.Property.PropertyName._in = params.param_PropertyNames;
}
记录计数(records.length)是正确的,如果我循环遍历记录数组,则记录集是正确的。
但是,在结果页面上,表格会显示一个更大的结果集,其中省略了 PropertyNames 过滤器。因此,如果我要搜索状态“打开”(mySQL 结果 50),然后为 params.param_PropertyNames 添加单个值 ['Property Name London SW45'],记录数为 6,记录数组为 6,但数据源显示是 50。所以数据源没有对属性数组进行过滤。
最初我尝试不添加额外的参数和表单小部件,只使用代码,例如
if (params.param_Property === null && canViewAllRecords === false) {
console.log(params.param_PropertyNames); // correct output
ds.filters.Property.PropertyName._in = properties; // an array of
properties to filter out
}
但这不起作用,因此想到了向计算的记录计数数据源添加表单小部件和附加参数的想法。
如果我在 query.parameters 进行检查,那么我会看到:-
"param_Status": "Open",
"param_PropertyNames": ["Property Name London SW45"],
如果我检查 query.filters:-
name=param_Status, value=Open
name=param_PropertyNames, value=[]}]}
看起来好像没有设置过滤器。即使硬编码 ds.filters.Property.PropertyName._in = ['Property Name London SW45'],我也会得到相同的结果。
你知道什么会导致这个问题以及我可以做些什么来解决这个问题吗?
解决方案
使用服务器端解决方案,我建议编辑应该按此属性列表过滤的 SQL 数据源查询脚本(服务器端),并在服务器端脚本中为计算的 Count 数据源包含相同的代码。代码看起来像这样,不知道你的确切细节:
var subquery = app.models.Directory.newQuery();
subquery.filters.PrimaryEmail._equals = Session.getActiveUser().getEmail();
subquery.prefetch.Property._add();
var results = subquery.run();
if(!results[0].CanViewAllRecords) {
query.filters.Property.PropertyName._in = results[0].Property.map(function(i) {return i.PropertyName;});
}
通过添加此代码,您将按当前用户过滤您的目录并预取 Property 关系表,然后仅当您的用户 canviewallRecords 为 false 并使用 JS map 函数在 Property 表中创建 PropertyName 字段的数组时才设置过滤器。正如我所说,您的代码可能不完全相同,具体取决于您必须如何检索用户 canviewallrecords 属性,然后当然我也不知道您在用户和属性表之间的关系,是一对多还是其他. 但这应该让您了解如何在服务器端实现这一点。
推荐阅读
- logback - Logback SiftingAppender 中的条件编码器
- ios - 存储为 textblob 后,未从 SQLite 数据库中正确检索列表
- php - 如何从 PhpSpreadsheet 中的合并单元格中读取值
- javascript - 当 cachel.delete 分配给变量时,为什么“无法在 'Cache' 上执行 'delete':非法调用”?
- java - spring数据@Query注解中如何在查询中使用mongodb
- macos - Vagrant 在 Vagrantfile 中找不到主机操作系统上的文件
- angular - 如果输入字段有焦点,我如何关闭我的 Datapicker 覆盖?
- excel - 隐藏所有工作表错误:“对象'_Worksheet'的方法'Visible'失败”
- react-native - 获取会话 ID 时出现意外的保留字“等待”
- java - 获得正确的 CBOR 输出