p:在p:dataTable中的commandLink ajax事件

时间:2011-10-02 21:44:20

标签: jsf-2 primefaces

假设我们有一个简单的表定义为:

<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。

干杯!

1 个答案:

答案 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>