gpt4 book ai didi

java - :commandButton not invoked when nested into own component extending UIData

转载 作者:太空宇宙 更新时间:2023-11-04 14:45:23 25 4
gpt4 key购买 nike

我已经看到了 BalusC 的答案以及更改范围的解决方案,但我尝试了它,我认为还有另一个问题似乎无法使用 JSF2 真正解决。

我创建了一个扩展 UIData 的自定义组件。该自定义组件显示一个包含数据行的表格,称为 PagingDataTable。它包含 PagingDataColumns,然后可以单击这些列并更改排序顺序等...

这工作正常,但是一旦我在 PagingDataColum 中添加 h:CommandButton,就不会调用按钮的操作。让我解释一下:

  • 它在使用嵌套的 f:ajax 元素时有效
  • 但是当仅在 h:CommandButton 中定义操作而不嵌套时,它不起作用

在这种特殊情况下,我不想使用 Ajax。我对其进行了调试,发现 ButtonRenderer 类的 Mojarra 实现(方法 wasClicked)不匹配。在这个方法内部,检查按钮是否被点击,这个检查是根据ID(实际上是名称,但这是ID)来完成的。但 UIData 组件有两个不同的 ID:

  • 当 rowIndex 存在时,带有 rowIndex 的 ID,例如渲染时
  • 当 rowIndex 不存在时,不带 rowIndex 的 ID,例如当用户点击按钮时

因此 wasClicked() 尝试在参数映射中查找没有 rowIndex 的 ID,但没有成功,因此不会调用操作方法。

恕我直言,这是 ButtonRenderer.wasClicked() 方法中的一个错误,该方法需要额外的逻辑才能理解不带 rowId 的 ID 与参数映射中带 rowId 的 ID 不完全匹配。

我在这里错过了什么吗?恕我直言,这与基础数据的范围无关,因为 rowId 在任何情况下都不存在,与范围无关。但我用 SessionScoped 尝试过,同样的事情也发生了。

我还下载了 Mojarra 2.1.28 版本:同样的事情也发生了。 Mojarra 2.2.X 似乎不太适合我的 Glasssfish 服务器版本,因此我无法尝试使用最新版本。我有点被困在这里,实际上用例非常简单:向 pagingDataTable 的任何列添加一个按钮并让它调用一个操作。

可以通过使用 Ajax 或自己进行一些 JS 编码来解决此问题...但这在 JSF2 中不是必需的?如有任何帮助,我们将不胜感激。

最佳答案

好的,很抱歉问这个问题。好像添加的时候

<f:param name="cid" value="#{javax.enterprise.context.conversation.id}" /> 

嵌套在 h:commandButton 中,它将(神奇地)设置被单击的行的 rowIndex,并且 ButtonRenderer 中的逻辑再次工作。那么一切都会顺利进行。

关于java - :commandButton not invoked when nested into own component extending UIData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24446792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com