我有一个使用具有可编辑列的Dojo Grid的REST服务。我可以在单元格中双击并更改值,但是,当我尝试保存更改时 - 使用按钮中的REST Service save()方法 - 更改不会保存。
我可以获得此值的唯一方法是首先在REST服务上调用revert()方法 - 单击按钮中的REST服务revert()方法 - 然后更改我需要的任何可编辑单元格转到并单击“保存”按钮。
以下是代码:
<xe:restService id="rsVictims" pathInfo="gridDataVictims">
<xe:this.service>
<xe:viewItemFileService defaultColumns="true"
viewName="InvoiceMPRVictims" contentType="application/json">
<xe:this.keys><![CDATA[#{javascript:viewScope.get("mprKeysValue");}]]></xe:this.keys>
<xe:this.databaseName><![CDATA[#{javascript:applicationScope.get("appConfig").keywords.appDataStore.join("!!")}]]></xe:this.databaseName>
</xe:viewItemFileService>
</xe:this.service>
</xe:restService>
<xp:button value="Save Changes" id="button1">
<xp:eventHandler event="onclick" submit="false">
<xp:this.script><![CDATA[// Save the changes...
rsVictims.save();]]></xp:this.script>
</xp:eventHandler>
</xp:button>
<xp:button value="Cancel Changes" id="button2">
<xp:eventHandler event="onclick" submit="false">
<xp:this.script><![CDATA[rsVictims.revert();]]></xp:this.script>
</xp:eventHandler>
</xp:button>
<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:djxDataGridColumn id="djxDataGridColumn3"
label="Nov" width="35px" field="month_11" editable="true">
</xe:djxDataGridColumn>
<xe:djxDataGridColumn id="djxDataGridColumn4"
label="Dec" width="35px" field="month_12" editable="true">
</xe:djxDataGridColumn>
<xe:djxDataGridColumn id="djxDataGridColumn5"
label="Jan" width="35px" field="month_1" editable="true">
</xe:djxDataGridColumn>
<xe:djxDataGridColumn id="djxDataGridColumn6"
label="Feb" width="35px" field="month_2" editable="true">
</xe:djxDataGridColumn>
<xe:djxDataGridColumn id="djxDataGridColumn7"
label="Mar" width="35px" field="month_3" editable="true">
</xe:djxDataGridColumn>
<xe:djxDataGridColumn id="djxDataGridColumn8"
label="Apr" width="35px" field="month_4" editable="true">
</xe:djxDataGridColumn>
<xe:djxDataGridColumn id="djxDataGridColumn9"
label="May" width="35px" field="month_5" editable="true">
</xe:djxDataGridColumn>
<xe:djxDataGridColumn id="djxDataGridColumn10"
label="June" width="35px" field="month_6" editable="true">
</xe:djxDataGridColumn>
<xe:djxDataGridColumn id="djxDataGridColumn11"
label="July" width="35px" field="month_7" editable="true">
</xe:djxDataGridColumn>
<xe:djxDataGridColumn id="djxDataGridColumn12"
label="Aug" width="35px" field="month_8" editable="true">
</xe:djxDataGridColumn>
<xe:djxDataGridColumn id="djxDataGridColumn15"
label="Sept" width="35px" field="month_9" editable="true">
</xe:djxDataGridColumn>
<xe:djxDataGridColumn id="djxDataGridColumn13"
label="Total" width="45px" field="victimTotal">
</xe:djxDataGridColumn>
<xe:djxDataGridColumn id="djxDataGridColumn14"
width="200px" label="Description" field="$Desc">
</xe:djxDataGridColumn>
</xe:djxDataGrid>
我浏览了Brad Balassastis的优秀教程: http://xcellerant.net/2013/04/25/dojo-data-grid-11-editiable-columns/
任何帮助都会很棒 - 谢谢!
编辑/补充信息:
我们有一个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>
这是DataGrid:
<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,计数= 25。
在第二个GET上,它似乎丢失了网格 - Response为空,JSON项为空,start = 25,count = 25。我已经尝试将REST服务中的start属性设置为0,但这没有做任何事情。我已经尝试将count属性设置为500,但这也没有解决它。
有趣的事实是,当视图在当前数据库中移动时 - 因此不使用REST服务上的databaseName属性 - “保存”按钮工作正常。此外,在加载DataGrid时只有一个GET,而在指向同一服务器上另一个数据库中的视图时,不是两个GET。我知道在寻找另一台服务器时存在一些问题,但这些数据库位于同一台服务器上。
提前致谢!
答案 0 :(得分:1)
丹,
我目前的项目几乎完全相同。我的工作完美,所以我想我可以提供帮助。我假设你已经采纳了Per Lausten的建议。如果你没有,你根本无法保存。
您的代码与我的代码之间的区别在于我使用的是xe:viewJSONService而不是xe:viewFileItemService。扩展库书说如果你想让它可以更新你必须使用viewFileItem,但这不是真的。
我对viewItemFileService只有麻烦,请参阅此博客文章,了解我遇到的问题(http://notesspeak.blogspot.com/2013/07/going-with-extjs-grid-and-giving-up-on.html)我几乎完全放弃了dojo网格,但又回到了它,因为它适用于移动设备。 / p>
使用viewJSONService正常工作。而不是键属性,使用类别筛选器。对于您的类别,代码类似于:
var category:String = lineItemBean.getThisUNID();
if(category == null){
return "show nothing"
} else {
return lineItemBean.getThisUNID();
}
//prevents all records from being returned
您需要小心,因为如果类别为null,则返回所有记录,这可能是一个大问题或安全漏洞。在我的例子中,我从一个bean中提取,但你也可以在那里放一个文档引用。