JSF-2.0,Mojarra 2.1.19,PrimeFaces 3.4.1
问题摘要:p:inputText
内部p:dataTable
和p:remoteCommand
触发的inputText操作将dataTable行索引作为参数传递与f:setPropertyActionListener
。但它总是传递dataTable的最后一行,而不是包含当前点击的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>
上面的代码表示当按下enter键时,激活p:remoteCommand
,它调用托管bean的insert方法。
@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
中显示了三个状态,请点击 second 状态(索引1)中的p:inputText
,输入“relax” “然后按回车键。
在调试控制台中,它正确显示“放松”,但它找到了错误的状态,因为indexStatusList
的值为{{>> {{1}中的最后一个状态 }。它必须是1,它是点击dataTable行的p:statusList
的索引。
我认为问题是关于屏幕上最后一个索引的p:inputText
。
如何运作?
我们假设有一个p:remoteCommand
而不是p:commandLink
和p:remoteCommand
:
p:inputText
此组件成功传递<p:commandLink action=#{statusBean.insertComment>
<f:setPropertyActionListener target="#{statusBean.indexStatusList}"
value="#{indexStatusList}"></f:setPropertyActionListener>
当前点击的组件。
答案 0 :(得分:1)
此解决方案中的概念问题在于p:remoteCommand
的工作方式。它创建JavaScript函数,其名称在name
p:remoteCommand
属性中定义。正如你在dataTable
中提出的那样,它会迭代并创建名为test
的JavaScript函数,就像此表中的行一样多次,最后一个只有一行。因此,解决方案可以在remoteCommand
的名称附加索引,但这很糟糕,因为您将拥有许多不必要的JavaScript函数。更好的方法是创建一个函数作为pass参数。因此,在数据表之外定义remoteCommand
:
<p:remoteCommand name="test" action="#{statusBean.insertComment}" update="statusRepeatPanel">
并在test
事件中调用onkeypress
函数:
test([{ name: 'rowNumber', value: #{indexStatusList} }])
这将在您的AJAX请求中传递rowNumber
参数。在支持bean的insertComment()
方法中,您可以读取此参数并使用它执行任何操作:
FacesContext context = FacesContext.getCurrentInstance();
Map map = context.getExternalContext().getRequestParameterMap();
Integer rowNumber = Integer.parseInt(map.get("rowNumber").toString());
注意:当您更新每行中的面板时,您可以将update
的{{1}}属性更改为remoteCommand
,这样就适用于所有行。
编辑:您可以使用Java方法中的以下代码更新特定行中的特定面板:
@parent