Jsf 2 验证失败时阻止primefaces datatable选择新行

Jsf 2 验证失败时阻止primefaces datatable选择新行,jsf-2,primefaces,jsf-2.2,Jsf 2,Primefaces,Jsf 2.2,我有一个主细节ui,显示数据表中的一些项。如果选择了项目,则详细信息将显示在表单中。 如果表单中存在无效数据,我希望阻止用户从dataTable中选择新项。“详细信息”侧会显示“已验证”错误,并且当存在验证错误时,不会更新表单(似乎是一个bulit in行为)。 不幸的是,我无法阻止用户选择dataTable中的另一行。我试过: <p:dataTable ...> <p:ajax event="rowSelect" update="some

我有一个主细节ui,显示数据表中的一些项。如果选择了项目,则详细信息将显示在表单中。 如果表单中存在无效数据,我希望阻止用户从dataTable中选择新项。“详细信息”侧会显示“已验证”错误,并且当存在验证错误时,不会更新表单(似乎是一个bulit in行为)。 不幸的是,我无法阻止用户选择dataTable中的另一行。我试过:

<p:dataTable ...>               
    <p:ajax event="rowSelect" update="someId" />
    <p:ajax event="rowUnselect" update="someId" oncomplete="if (args &amp;&amp; args.validationFailed) return false;" process=":detialsFormId" />
    ...
</p:dataTable>

...
但这不起作用。正如我所知,只有在
oncomplete
中才有可用的
args
变量。我认为无论是
行选择
还是
行取消选择
都太迟了。 也许还有别的办法?考虑一个远程命令,在验证失败时设置t-1选择。但也许还有另一个更奇特的解决方案

问候
Oliver

您可以将表单放入对话框中,并使其成为模态。这是防止其他操作的常用方法之一。主详细信息已经在对话框中。主视图位于p:布局的左侧,而详图位于右侧的另一个布局中。用户还必须能够快速切换项目。然后尝试在表单中出现验证错误时激活的块ui。如果未经验证就完成了,请再次删除。我已经考虑过这一点。但无论如何,我必须抑制数据表中的选择。如果用户选择了一个细节字段为必填且为空的项目,并且用户立即从datatable中选择了另一个项目,那么我就可以切换回预选的项目。也许我应该在最后点击save按钮时完成所有验证工作,而不是使用blur事件。但这可能会生成大量验证消息(与DataTableItems count相同)。您建议的后者听起来是错误的。让我想想另一个解决办法