p:对话框内的对话框中的按钮不是调用控制器方法

时间:2015-03-14 19:52:21

标签: jsf jsf-2 primefaces controller dialog

我遇到标题中描述的问题。

问题的小描述如下: 我有用于打开对话框的按钮。然后,在该对话框中,有一个按钮可以在第一个对话框的顶部打开另一个对话框。单击第二个按钮后,我希望调用控制器的方法,但没有任何反应。 h:outputText 中的值被正确读取,所以我猜这不是连接控制器 - >视图的问题。

我正在使用:

  • Spring web 3.1.2.RELEASE
  • JSF 2.2.10
  • Primefaces 5.1

代码:

的beans.xml

<bean id="testController" class="test.TestController" />

TestController.java

public class TestController implements Serializable
{
   private static final long serialVersionUID = 7028608421091861830L;

   private String test;

   public TestController()
   {
      test = "abc";
   }

   public void testMethod()
   {
      test = "cba";
   }

   public String getTest()
   {
      return test;
   }
}

test.xhtml

<h:panelGrid columns="1" cellpadding="5">
     <p:commandButton value="Basic" type="button" onclick="PF('dlg1').show();" />
  </h:panelGrid>

  <p:dialog widgetVar="dlg1">
     <h:outputText value="Resistance to PrimeFaces is futile!" />
     <h:panelGrid columns="1" cellpadding="5">
        <p:commandButton value="Basic" type="button" onclick="PF('dlg2').show();" />
     </h:panelGrid>

     <p:dialog widgetVar="dlg2">
        <h:outputText value="#{testController.test}" />
        <p:commandButton value="Call method" type="button" actionListener="#{testController.testMethod}" />
     </p:dialog>
  </p:dialog>

我尝试了什么:

  • appendToBody =&#34; true&#34; 添加到每个 p:对话框
  • p:commandButton 更改为 p:按钮
  • actionListener 更改为操作

但没有任何帮助。

如果没有给出给定方法的原因可能会有任何帮助或建议,我将不胜感激。

2 个答案:

答案 0 :(得分:3)

有3个问题。

  1. 您正在嵌套<p:dialog>个组件。这没有意义。将它们分开。

  2. <p:dialog>必须有自己的<h:form>,尤其是当您明确使用appendToBody="true"appendTo="@(body)"时,否则无法提交任何内容,因为JavaScript会重新定位对话框超出它在HTML DOM树中的位置到身体的末端,导致它不再处于某种形式。

  3. <p:commandButton type="button">充当&#34;点击&#34;按钮,而不是提交按钮。从提交按钮中删除该属性。

  4. 总而言之,这应该是这样的:

    <h:form>
        <h:panelGrid columns="1" cellpadding="5">
            <p:commandButton value="Basic" type="button" onclick="PF('dlg1').show();" />
        </h:panelGrid>
    </h:form>
    
    <p:dialog widgetVar="dlg1">
        <h:form>
            <h:outputText value="Resistance to PrimeFaces is futile!" />
            <h:panelGrid columns="1" cellpadding="5">
                <p:commandButton value="Basic" type="button" onclick="PF('dlg2').show();" />
            </h:panelGrid>
        </h:form>
    </p:dialog>
    
    <p:dialog widgetVar="dlg2">
        <h:form>
            <h:outputText value="#{testController.test}" />
            <p:commandButton value="Call method" actionListener="#{testController.testMethod}" />
        </h:form>
    </p:dialog>
    

答案 1 :(得分:3)

行。我想我找到了解决这个问题的方法。

似乎问题是:

type="button"

我从每个按钮的属性列表中删除了它,现在即使没有 h:form 也能正常工作。谢谢你的帮助。