假设我们有一个简单的表定义为:
<p:dataTable value="#{testBean.dummyStringData}" var="data">
<p:column>
<p:commandLink action="#{testBean.printData(data)}">
<h:outputLabel value="#{data}" />
</p:commandLink>
</p:column>
</p:dataTable>
一个简单的支持bean:
public class TestBean {
private List<String> dummyStringData = new ArrayList<String>();
//getters and setters omitted
@PostConstruct
public void postConstruct() {
dummyStringData.add(new String("DummyData1"));
dummyStringData.add(new String("DummyData2"));
dummyStringData.add(new String("DummyData3"));
}
public void printData (String data) {
System.out.println(data);
}
可以预见,点击表格中的链接会将点击的行的内容打印到标准输出。
现在,我希望当用户将鼠标光标悬停在表格中的 p:commandLink 上时,也可以调用 printData 方法。为了实现这一点,我尝试在 p:commandLink 元素中嵌套 p:ajax 元素:
<p:commandLink action="#{testBean.printData(data)}">
<p:ajax event="mouseover" listener="#{testBean.printData(data)}" />
<h:outputLabel value="#{data}" />
</p:commandLink>
此方法似乎不适用于 p:commandLink 和 p:commandButton 组件。将鼠标悬停在链接上似乎什么都不做。如果我要使用除这两个之外的组件(即 p:inputText 并嵌套 p:ajax ,如上所述),我会得到预期的行为。
现在,使用 p:commandLink 的 onmouseover 和 p:remoteCommand 我设法触发相应的ajax事件:
<p:commandLink action="#{testBean.printData(data)}" onmouseover="rc()">
<h:outputLabel value="#{data}" />
</p:commandLink>
<p:remoteCommand name="rc" action="#{testBean.printData(data)}" />
但是,作为参数传递给 printData 方法的 data 变量并不特定于触发事件的行。相反,总是使用集合中的最后一个元素(在这种情况下,它将是“DummyData3”)。
我在Tomcat 7的MyFaces 2.1.3上使用Primefaces 3.0.M3。
干杯!
答案 0 :(得分:1)
There's a solution on the PrimeFaces forum
...替代地
我怀疑因为生成的JavaScript函数的名称对于每次迭代都是相同的,所以最后一个是胜利者。你可以这样做,给每个人一个独特的名字:
<p:dataTable value="#{testBean.dummyStringData}" var="data" rowIndexVar="rowIndex">
<p:column>
<p:commandLink action="#{testBean.printData(data)}" onmouseover="rc_#{rowIndex}()">
<h:outputLabel value="#{data}" />
</p:commandLink>
<p:remoteCommand name="rc_#{rowIndex}" action="#{testBean.printData(data)}" />
</p:column>
</p:dataTable>