viewJsonService向dataGrid返回太多条目

时间:2015-10-14 10:15:29

标签: xpages xpages-extlib

我已将ExtLib REST服务设置为“xe:viewJsonService”并将其连接到多米诺骨牌视图。目前该视图包含63个条目。这些条目背后的文档具有读访问限制。

服务返回的Json由Dojo数据网格(取自ExtLib库)使用。

该页面由对64个条目中只有一个具有读访问权限的测试用户访问。但是,该用户看到的数据网格包含一个数据元素,后面跟着63个空条目,如下所示:

enter image description here

查看原始Json数据,我发现该服务确实只返回一个条目,但它知道有63个兄弟:

[
  {
      "@entryid":"1-6C5763E4A122F1D3C1257EC700355386",
      "@unid":"6C5763E4A122F1D3C1257EC700355386",
      "@noteid":"3FD2E",
      "@position":"1",
      "@read":true,
      "@siblings":63,
      "@form":"fInvoice",
      "colIconStatus":"imgInvExported.gif",
      "colIconLock":"blank.gif",
      "invInvoiceDate":"2015-09-21T09:44:27Z",
      "invJobInvNumbers":"111\/5152\/52567\/ 001",
      "invSupplierNameShort":"My Test Company GmbH",
      "invAmount":121.5
  }
]

从技术上讲,这是正确的,因为该服务可以访问所有64个条目。问题是数据网格为64个条目而不是只有一个条目创造了空间。

问题是:如何告诉数据网格显示正确的数据量?或者我是否需要操纵REST服务?

编辑:继续寻找可能的解决方案,同时找到了Eric McCormick的其他一些相关问题this one(包括Stephan Wissel的一个非常好的方法),或者是Steve Zavocki的this one。所以我的问题是重复的,真的......(对不起)

2 个答案:

答案 0 :(得分:2)

警告:请阅读本答案的底部,因为您可能遇到意想不到的问题!

最后经过一些游戏之后,我偶然发现了一个似乎有所帮助的不起眼的财产,无论出于何种原因(我将把这个问题作为一个新问题): 属性globalValues似乎可用于服务类型xe:documentJsonServicexe:viewItemFileServicexe:viewJsonLegacyServicexe:viewJsonServicexe:viewXmlLegacyService。此属性有三个固定选项,称为Entries(= 0x0001),Top Level(= 0x0002)和Timestamp(= 0x0004)。只是通过玩goold旧的“试错”游戏,我发现将此属性设置为1(=条目)会修改/过滤结果数据:

默认情况下,xe:viewItemFileService返回的原始JSON如下所示:

{
    "@timestamp":"2015-10-14T12:57:59Z",
    "@toplevelentries":63,
    "items":
    [
      {
          ...
      }
    ]
}

globalValues设置为“1”会从输出中删除@timestamp@toplevelentries字段:

{
    "items":
    [
      {
          ...
      }
    ]
}

更重要的是,这也会从我的数据网格中删除空行!

只有一件事让我感到紧张,那就是我找不到任何有关该财产的解释。所以我真的不知道是否有任何不必要的副作用......

更新:感谢Knut Herrmann我对此做了更多测试(请参阅下面的评论)。在我的测试案例中,我认为有超过13,000份文件;只要我的测试用户只能阅读少量的那些东西似乎都很好。然后我在启用读取的列表中添加了200多个文档。结果是一个数据网格,不断重新计算其滚动条:我滚动得越远,滚动句柄越小。一旦我到达底线但是网格变为berzerk并且决定仅显示前13行(?!?),并且还将滚动条全部移除。但性能并不像我预期的那么糟糕。

所以我必须同意Knut的观点,对于大型视图与大量可访问条目的组合,这不是一个很好的解决方案!

答案 1 :(得分:1)

洛萨,

我之前已经经历过这一点,正如你所指出的那样。我相信答案是使用'keys'属性来过滤掉无效的条目。

我不确定您的应用程序是如何构建的,但如果用户只能在视图中看到某些条目,我会考虑按用户分类,然后使用这些键仅向他们显示他们有权访问的行

您询问是否可以更改dojo网格以排除条目。我认为答案是否定的。您可以选择通过REST服务或Notes视图进行过滤。

这是我写的关于我遇到的问题的相关博客文章。 http://notesspeak.blogspot.com/2013/07/creating-updatable-rest-service-for-use.html

编辑 2其他要尝试的事项

1)您是否在我的博文中看到了评论?我自己没试过。归功于博客评论 - “Goo Goo”。

“我在网格的onstyleRow事件中使用此代码来解决空白行问题”

使用viewJsonService:

var row = arguments[0];
var rowItem = djxDataGrid1.getItem(row.index);
var rowCount = Object.keys(restService1._index).length - 1; //-1 for omit the onUpdate event
if(row.index >= rowCount){
row.customStyles += 'display:none;';
}

2)我个人为解决这个问题所采取的措施是在这个答案:How to configure an xe:viewFileItemService on an XPage to filter the data in a categorized view?

鉴于您对视图结构所说的内容,我不确定这是否适用于您。