JSF-2.0、Mojarra 2.1.19、PrimeFaces 3.4.1
问题总结:有一个p:inputText
insidep:dataTable
和 inputText 动作,通过p:remoteCommand
它传递 dataTable 行索引作为参数f:setPropertyActionListener
。但它总是通过 dataTable 的最后一行,而不是包含当前 clicked 的行的索引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 属于. 它必须是 1,这是在 dataTable 行上单击的索引。 p:statusList
p:inputText
我认为问题在于p:remoteCommand
屏幕上的最后一个索引。
这个怎么运作?
让我们想象有一个p:commandLink
代替p:remoteCommand
and p:inputText
:
<p:commandLink action=#{statusBean.insertComment>
<f:setPropertyActionListener target="#{statusBean.indexStatusList}"
value="#{indexStatusList}"></f:setPropertyActionListener>
这个组件成功地传递了indexStatusList
当前点击的那个。