【问题标题】:p:commandButton does not fire actionp:commandButton 不触发动作
【发布时间】:2012-01-06 08:51:38
【问题描述】:

问题是:actionlistener 不想被解雇

@ManagedBean(name="hotelsController")
@SessionScoped
   public class HotelsController implements Serializable {
      public void requestHotelAvail(ActionEvent event) {
         request = new Request(df.format(arrivalDate), df.format(departureDate));
      }
   }

和xhtml

<h:panelgroup id="rooms"/>
<h:form  id="hotelSearch">
            <p:commandButton actionListener="#{hotelsController.requestHotelAvail}" value="submit" update="rooms" />
</h:form>

我已经尝试了所有我能搜索到的将@managedbean 更改为@componentimport 设置为import javax.faces.event.ActionEvent;

但它仍然没有触发任何东西。

表单位于p:accordion 中,与h:commandbutton 一起使用时效果很好

编辑:抱歉误导。单击后房间会更新,但不会触发 actionListener。所以房间不会得到任何新数据。 requestHotelAvail 中的重要代码需要在更新房间之前触发,而不是。

EDIT2PrimeFaces 2.2.1 - 我已经阅读了 primefaces 的整本手册,但没有任何解释,因为我已经完成了它所说的所有内容

我尝试使用action 代替actionListener 而不使用ActionEvent,但它从来没有做任何事情。使用 &lt;h:commandbutton action="#{hotelscontroller.requestHotelAvail}"/&gt; 效果很好,但我希望 ajax 引擎只刷新 rooms panelgroup

更新:现在可以了。表单不能在&lt;p:accordion&gt; 中,但为什么以及如何在其中启用它?现在形成,没有它我就可以工作。

【问题讨论】:

  • “不触发任何东西”您的实际意思是 1) 未调用该方法(由调试器、记录器或 sysout 确认),或者 2) rooms panelgroup 未更新?
  • 不能解决您的问题,但最好将表单组件置于所有其他组件之上,只要它不干扰其他表单(也避免使用内部表单)
  • 另外,在该方法中添加一些sysout's 以确保或在该类中创建另一个方法...在服务器日志中没有出现任何内容?比如找不到 bean,或者找不到动作/属性?如果您使用 Netbeans,请确保您的类已正确构建...
  • 什么 PrimeFaces 版本?尝试使用 action 而不是 actionListener 并删除您无论如何都不会使用的 ActionEvent 参数。

标签: jsf primefaces


【解决方案1】:

我怀疑 h:commandLink 的不同行为来自 ajax/非 ajax 处理。

默认情况下 - 如果您不使用 f:ajax - h:commandLink 是非 ajax 并且会重新呈现整个页面。 Primefaces p:commandLink 正在使用 ajax,您将房间指示为要更新的组件。在您的情况下,房间不在表格中,所以它应该被称为 :rooms (注意冒号)而不是房间。

更新:您是否尝试过使用 h:commandLink 进行 ajax?应该是:

<h:commandButton action="#{hotelscontroller.requestHotelAvail}" value="submit">
  <f:ajax render=":rooms"/>
</h:commandButton>

另外,我对 primefaces 不太熟悉,但也许您可以尝试使用额外的 process="@this" 明确指示要处理的组件 - 尽管我认为这是基本库中的默认设置。

【讨论】:

  • 我没有使用 h:commandLink,问题不在于update,而在于actionListener。更新工作正常
  • 好吧 &lt;h:commandButton action="#{hotelscontroller.requestHotelAvail}" value="submit"&gt; &lt;f:ajax render=":rooms"/&gt; &lt;/h:commandButton&gt;it 现在的行为与 &lt;p:commandButton&gt; 一样,因此面板组已更新,但未触发操作。 managedBean 或整个 xhtml 必须有更大的问题
  • 你能试着把它放在 p:accordion 之外吗?这听起来像是一个迭代组件,而这些往往是有问题的。
  • 谢谢你,这就像一个魅力,但现在我必须找出原因以及如何在&lt;p:accordion.中使用它。
  • 如果您认为这是 p:accordion 的问题,请提出问题。
【解决方案2】:

您尝试检查响应:

打开 Chrome 或 Firefox -> Inspect Element -> Network 并按照 ajax 调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    相关资源
    最近更新 更多