【问题标题】:JSF - p:dataTable - p:commandButton doesn't work even inside p:columnJSF - p:dataTable - p:commandButton 即使在 p:column 内也不起作用
【发布时间】:2011-05-31 01:49:26
【问题描述】:

我在 DataTable 中有一个 commandButton。但是,当我单击它时不会调用“动作”(与 actionListener 效果相同);我在服务器操作开始时添加了日志,但它从未显示。 请注意,该按钮在数据列表之外时可以正常工作。

这是我的代码:

<h:form id="compSearchForm">
    <p:dataTable var="competency" value="#{competencySearchBean.matchingCompetencies.toArray()}">
        <p:column>
            <f:facet name="header">
                <h:outputLabel value="Title" />
            </f:facet>
            <h:outputText value="#{competency.title}" />
        </p:column>

        <p:column>
            <p:commandButton value="Go" id="actionButton" action="#{myBean.doAction}" />
        </p:column>
    </p:dataTable>
</h:form>

您知道问题可能是什么吗?

【问题讨论】:

    标签: jsf datatable primefaces


    【解决方案1】:

    我将您的按钮列代码与支持 bean 中的虚拟方法一起添加到我的现有代码中。当我按下它正常工作的按钮时,该方法被正确调用。这是我添加到数据表中的代码:

    <p:column>
        <p:commandButton value="Go" id="actionButton" action="#{tableBean.buttonAction()}" />
    </p:column>
    

    这是我的支持 bean 中的 buttonAction 方法:

    public void buttonAction()
        {
            int a = 0;
            for(int i = 0; i < 100; i++)
                a = i;
        }
    

    我在这个方法上放了一个断点,所以我知道当我点击按钮时它会被调用。 我更进一步,使用了您的数据表代码(使用我的数据源),当我按下按钮时,该方法仍在被调用。我不知道您使用的是什么开发环境,但如果它具有调试模式,请在您的 doAction 方法上设置断点,以及 bean 中的其他一些战略位置,然后在调试模式下运行您的项目以查看发生了什么.

    【讨论】:

    • 感谢您的帮助肖恩。我在 Tomcat 7、JSF 2.0、PrimeFaces 2.2RC1 上。我可以看到我们的调用之间的明显区别是您调用带有括号的“buttonAction()”。我会试试的,然后告诉你。
    • 似乎可以工作 :) 非常感谢您的帮助(尽管添加括号使其工作仍然感觉很奇怪)。
    【解决方案2】:

    我认为你必须改为:

    <h:form id="compSearchForm">
    <p:dataTable var="competency" value="#{competencySearchBean.matchingCompetencies.toArray()}">
        <p:column>
            <f:facet name="header">
                <h:outputLabel value="Title" />
            </f:facet>
            <h:outputText value="#{competency.title}" />
        </p:column>
    </p:dataTable>
    <p:commandButton value="Go" id="actionButton" action="#{myBean.doAction}" />
    </h:form>
    

    我认为您不能在 dataTable 中使用按钮。试试这个。

    【讨论】:

    • 这确实有效,但这并不是我想要做的。我想在每一行上都有一个按钮/链接/图标,当用户点击它时,会执行一个取决于行数据的操作。
    • 如果你正在使用 seam,你可以使用s:button,它会按照你的意愿工作。这是因为它将执行 GET 而不是 POST。如果要发布每一行,您还可以尝试将&lt;h:form&gt; 封装在数据表中,以便每一行都有自己的形式
    • 我尝试在数据表中添加一个新的 f:form,但如果我这样做,则不再显示任何内容。虽然没有 javascript 错误,所以我真的不知道为什么。
    【解决方案3】:

    看这个例子 - http://www.primefaces.org/showcase/ui/datatableRowSelectionByColumn.jsf

    我认为您必须在 id 前面加上表单 ID

    看看它是如何更新 ":form:display" 而不仅仅是 "display"

    为我工作

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题,在尝试了不同的方法后,我通过在Beaninit 方法中初始化我的List(我在p:datatable 中使用的列表)解决了这个问题。

      使用此表单,列表会转到包含一些值的页面。

      即使我输入List&lt;Paciente&gt; myList = new ArrayList&lt;Paciente&gt;();,它也不起作用。 我必须在列表中添加一些值。这是解决问题的唯一方法。

      【讨论】:

      • 我真的怀疑这个答案与这个问题有任何关系。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-22
      • 2013-08-01
      • 1970-01-01
      • 2012-07-24
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      相关资源
      最近更新 更多