【问题标题】:XPages Dojo DataGrid and REST Service do not save editable columns changesXPages Dojo DataGrid 和 REST 服务不保存可编辑列更改
【发布时间】:2013-12-21 05:36:48
【问题描述】:

我们有一个 REST 服务和 Dojo DataGrid,它不会在初始加载时保存对可编辑列的更改——这意味着 XPage 加载并进行了更改。保存更改的唯一方法是在调用 REST 服务的 close() 或 revert() 方法之后,然后调用 save() 方法。 REST 服务指向同一服务器上的另一个数据库,并使用 keys 属性:

<xe:restService id="rsVictims" pathInfo="rsVictimsData">
<xe:this.service>
    <xe:viewItemFileService defaultColumns="true"
        viewName="InvoiceGridVictims" contentType="application/json"
        databaseName="voca\vocadatastore.nsf" keys="k28ts71zrjsw">
    </xe:viewItemFileService>
</xe:this.service>
</xe:restService>

这是数据网格:

<xe:djxDataGrid id="djxDataGrid1" storeComponentId="rsVictims"
    autoHeight="90">
    <xe:djxDataGridColumn id="djxDataGridColumn1"
        label="Target" width="35px" field="victimTarget">
    </xe:djxDataGridColumn>
    <xe:djxDataGridColumn id="djxDataGridColumn2"
        label="Oct" width="35px" field="month_10" editable="true">
    </xe:djxDataGridColumn>
</xe:djxDataGrid>

它是这样流动的:

使用 REST 服务和 DataGrid 打开 XPage

更改可编辑列 单击调用此代码的保存按钮(代码复制自Brad Balassaitis' demo,06 自定义控件):
 <xp:button value="Save Changes" id="victimsSaveButton">
                <xp:eventHandler event="onclick" submit="false">
                    <xp:this.script><![CDATA[// Save the changes...
editedRows = [-1];
var args = {onError: function() {alert('error!');}};
rsVictims.save(args);

//Refresh the grid
rsVictims.close();
dijit.byId('#{id:djxDataGrid1}')._refresh();]]></xp:this.script>
                </xp:eventHandler>
            </xp:button>

DataGrid 已关闭、刷新,但未保存更改

再次进行更改,然后单击保存按钮 DataGrid 已关闭、刷新,现在保存更改

我注意到,当 XPage 打开时,DataGrid 被加载了两次——我看到这是 Net 选项卡中的 Firebug。在第一次 GET 中,它正确检索了网格——响应正确,JSON 格式正确,start=0,count=25。

在第二次 GET 中,似乎丢失了网格——响应为空,JSON 项为空,start=25,count=25。我尝试将 REST 服务中的 start 属性设置为 0,但这并没有做任何事情。我也尝试将 count 属性设置为 500,但这也不能解决问题。

关于这一点的有趣事实是,当视图在当前数据库中移动时——因此不使用 REST 服务上的 databaseName 属性——保存按钮可以正常工作。此外,加载 DataGrid 时只有一个 GET,而不是指向同一服务器上另一个数据库中的视图时的两个 GET。我知道在查看另一台服务器时会出现一些问题,但这些数据库位于同一台服务器上。

我知道我已经发布了关于 this topic before 的帖子,但我没有得到有效的答案。我希望这能让我更清楚地了解我可能缺少的东西。

提前致谢!

【问题讨论】:

  • 丹,如果这个问题与另一个问题完全相同,那么更新原始问题 - 因为这个问题将作为重复问题关闭。获得更多声望点后,您可以在原始问题中添加赏金,以便在回答问题时获得更多关注
  • 我没有看到您的评论,如果您希望我将我的答案移至其他问题,请告诉我。
  • @Per - 我已按要求将此问题移至另一个问题。
  • 我也移动了我的答案。这个问题可以去掉。

标签: datagrid xpages


【解决方案1】:

丹,

在我当前的项目中,我的情况几乎相同。我的工作很完美,所以我想我可以提供帮助。我假设您已经在之前的 SO 中采纳了 Per Lausten 的建议。如果你不这样做,你根本无法保存。

你的代码和我的不同之处在于我使用的是 xe:viewJSONService 而不是 xe:viewFileItemService。扩展库书说,如果您希望它可更新,则必须使用 viewFileItem,但事实并非如此。

我在 viewItemFileService 上遇到了麻烦,请参阅这篇博文了解我遇到的问题 (http://notesspeak.blogspot.com/2013/07/going-with-extjs-grid-and-giving-up-on.html) 我几乎完全放弃了 dojo 网格,但又回到了它,因为它可以在移动设备上运行。

使用 viewJSONService 就可以了。使用类别过滤器代替键属性。对于你的类别有类似这样的代码:

var category:String = lineItemBean.getThisUNID();
if(category == null){
    return "show nothing"
} else {
    return lineItemBean.getThisUNID();
}
//prevents all records from being returned

您需要小心,因为如果类别为空,则返回所有记录,这可能是一个大问题或安全漏洞。在我的示例中,我从 bean 中提取,但您也可以在其中放置文档引用。

【讨论】:

  • 使用 viewJSONService,我认为我们需要创建一个 Web Config/Site 文档?如果没有,我会试试你的答案。谢谢你。代码应该是:
  • 我从未创建过网络配置文档。我确实让管理员允许 PUT 和 DELETE 的 HTTP 动词。这是在地址簿中完成的。另外,对明智的人说的话,您还应该注意 Per Henrik Lausten 的建议,以删除您的重复问题之一,否则有人会为您做。他们在 SO 上经营着一艘紧张的船。祝你好运,把这件事做好对我来说是一场斗争,所以我能感受到你的痛苦。
猜你喜欢
  • 1970-01-01
  • 2013-11-23
  • 2012-09-03
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多