我一直在使用数据表来允许用户输入和编辑大量数据,但是发现一旦达到大量(但不确定)的列和行数量,表单将无法提交,并且所有与服务器的通信形式被切断(不相关的按钮,ajax等),直到执行页面刷新。
这是我的计算机/浏览器的限制,还是对可以在数据表中显示的最大可编辑数据量有硬编码限制?这可能是因为表单中输入字段数量的最大限制吗?
是我的数据表使用paginator的唯一解决方案吗?
以下是一个示例,如果行/列太多,将无法编辑(对我来说)。
<h:form>
<p:dataTable var="_var" value="#{bean.values}" editable="true">
<p:column headerText="Value">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{_var.value}" /></f:facet>
<f:facet name="input"><p:inputText value="#{_var.value}" /></f:facet>
</p:cellEditor>
</p:column>
<!-- Copy and paste this^ column 15 times -->
<p:column>
<p:rowEditor />
</p:column>
</p:dataTable>
</h:form>
答案 0 :(得分:3)
使用行或单元格编辑器时,请指示cellEdit
事件使用partialSubmit="true"
。
<p:dataTable ... editable="true">
<p:ajax event="cellEdit" process="@this" partialSubmit="true" />
...
</p:dataTable>
这将仅发送process
属性(行或单元本身)覆盖的输入字段,而不是每个输入字段。
答案 1 :(得分:2)
好的,我找到了solution。
显然每个输入都是作为GET / POST参数发送的,服务器上的默认限制为512,以防止DoS攻击。
不幸的是,Primefaces似乎没有显示这个错误,因此很难找到 编辑:如果日志记录设置为正确级别,则显示错误。该错误也会显示在F12开发人员工具调试日志中。
简而言之,您必须转到服务器standalone.xml
并添加:
<property name="org.apache.tomcat.util.http.Parameters.MAX_COUNT" value="10000"/>
在<system-properties>
下
修改强>
我拒绝放弃比发送数千个参数更好的解决方案,并重新审视了这个问题。
似乎在<p:ajax partialSubmitFilter="">
属性中添加了PrimeFaces 5.2,它允许过滤您想要的输入。这对我来说没有用,因为我无法使用此功能将提交的数据缩小到行。
相反,我决定覆盖PrimeFaces.ajax.Request.send
函数,如下所示:
var pfsend = PrimeFaces.ajax.Request.send;
PrimeFaces.ajax.Request.send = function(cfg) {
if (cfg.event === 'rowEdit' || cfg.event === 'rowEditCancel') {
// This is an operation on a datatable row. Filter for only that row
cfg.partialSubmitFilter = '[data-ri=' + cfg.ext.params[0].value + '] :input';
}
pfsend(cfg); // Run the original function
};
通过这种方式,cfg的第一个参数(即正在编辑的行)的值被用作查找属性data-ri
设置为该值(行)的元素的值。
请注意,此 要求您使用primefaces 5.2,但对于旧版本,可以通过覆盖整个包来实现相同的操作,并在相同功能的正确位置策略性地放置相似的行(请注意,cfg.partialSubmitFilter将不存在)。
答案 2 :(得分:1)
我找到了更优雅的解决方案,没有覆盖PrimeFaces.ajax.Request.send函数,但仍然只在rowEdit事件上发生。 首先,定义javascript函数:
<Enter>
然后在onstart回调中调用它:
function sendOnlyEditedRow(cfg) {
cfg.partialSubmitFilter = "[data-ri=" + cfg.ext.params[0].value + "] :input";
}