我已经看到了BalusC的答案以及改变范围的解决方案,但我尝试了它并且我认为还有另一个问题似乎无法使用JSF2解决。
我创建了一个扩展UIData的自定义组件。此自定义组件显示包含数据行的表,称为PagingDataTable。它包含PagingDataColumns,然后可以单击它并更改排序顺序等...
这很好用,但只要在PagingDataColum中添加h:CommandButton,就不会调用该按钮的操作。让我解释一下:
在这种特殊情况下,我不想使用Ajax。我调试了它,我发现ButtonRenderer类的Mojarra实现不匹配(方法被点击)。在此方法中,检查是否单击了按钮,并根据ID(实际上是名称,但这是ID)完成此检查。但是UIData组件有两个不同的ID:
因此,wasClicked()尝试在参数映射中找不到没有rowIndex的ID,但无效,因此,不会调用action方法。
恕我直言这是ButtonRenderer.wasClicked()方法中的一个错误,它需要有额外的逻辑才能理解没有rowId的ID与带有rowId的ID的参数映射中不完全匹配。
我在这里错过了什么吗?恕我直言这与底层数据的范围无关,因为rowId在任何情况下都不存在,与范围无关。但我尝试使用SessionScoped,同样的事情正在发生。
我还下载了Mojarra的2.1.28版:同样的事情正在发生。 Mojarra 2.2.X似乎无法轻松使用我的Glasssfish服务器版本,因此我无法使用最新版本进行尝试。我有点困在这里,实际上用例非常简单:在pagingDataTable的任何列中添加一个按钮,让它调用一个动作。
可以通过使用Ajax或者自己做一些JS编码来为此做一个解决方法......但是在JSF2中这不是必需的吗?任何帮助表示赞赏。
答案 0 :(得分:0)
好的,抱歉提出这个问题。 似乎在添加
时<f:param name="cid" value="#{javax.enterprise.context.conversation.id}" />
嵌套在h:commandButton中,它将(神奇地)设置被单击的行的rowIndex,并且ButtonRenderer中的逻辑再次起作用。一切顺利。