【发布时间】:2013-02-06 02:15:37
【问题描述】:
JSF-2.0、Mojarra 2.1.19、PrimeFaces 3.4.1
问题总结:在p:dataTable 内有一个p:inputText 和由p:remoteCommand 触发的inputText 操作,它将dataTable 行索引作为f:setPropertyActionListener 的参数传递。但它总是传递数据表的最后一行,而不是包含当前点击的行的索引p:inputText。
从我之前的问题可以看出,我正在尝试使用p:inputText 作为 Facebook 等状态的评论接受者。实现包括p:dataTable。它的行代表每个状态。好像是:
<p:dataTable id="dataTable" value="#{statusBean.statusList}" var="status"
rowIndexVar="indexStatusList">
<p:column>
<p:panel id="statusRepeatPanel">
<p:remoteCommand name="test" action="#{statusBean.insertComment}"
update="statusRepeatPanel">
<f:setPropertyActionListener
target="#{statusBean.indexStatusList}"
value="#{indexStatusList}">
</f:setPropertyActionListener>
</p:remoteCommand>
<p:inputText id="commentInput" value="#{statusBean.newComment}"
onkeypress="if (event.keyCode == 13) { test(); return false; }">
</p:inputText>
</p:panel>
</p:column>
</p:dataTable>
上面的代码说当按下回车键时,触发p:remoteCommand,它调用托管bean的插入方法。
@ManagedBean
@ViewScoped
public class StatusBean {
List<Status> statusList = new ArrayList<Status>();
public int indexStatusList;
public String newComment
//getters and setters
public void insertComment() {
long statusID = findStatusID(statusList.get(indexStatusList));
statusDao.insert(this.newComment,statusID)
}
让我们一起调试;假设p:dataTable 中显示了三个 状态,单击处于第二 状态(索引为1)的p:inputText,键入“relax”并按输入密钥。
在调试控制台中,它正确显示“放松”,但它发现了错误的状态,因为indexStatusList 的值2 属于p:statusList 中的最后一个状态。它必须是 1,即点击 dataTable 行的p:inputText 的索引。
我认为问题在于p:remoteCommand,它采用屏幕上的最后一个索引。
它是如何工作的?
假设有一个p:commandLink 而不是p:remoteCommand 和p:inputText:
<p:commandLink action=#{statusBean.insertComment>
<f:setPropertyActionListener target="#{statusBean.indexStatusList}"
value="#{indexStatusList}"></f:setPropertyActionListener>
此组件成功传递indexStatusList 作为当前单击的一个。
【问题讨论】:
标签: jsf jsf-2 primefaces