【问题标题】:f:setPropertyActionListener not invokedf:setPropertyActionListener 未调用
【发布时间】:2012-05-16 19:03:23
【问题描述】:

我正在尝试将p:dialog 移出h:form,因为我已经读到这是首选方式(但是我想了解原因,因为我的p:dialogform 中在我的应用程序中运行良好)。

唯一的困难是对话框标题需要动态更新。单击p:dataTable 中的按钮时会显示该对话框。

这是我的旧 xhtml(更改之前),工作正常:

<p:dataTable var="event" value="#{eventBean.lazyModel}" selection="#{eventBean.selectedEvent}" />
    ...
    <p:column headerText="#{msgs.Persons}">
        <p:commandButton value="#{msgs.ViewPersons}" update=":viewPersonsForm" oncomplete="viewPersonsDlg.show()"> 
            <f:setPropertyActionListener value="#{event}" target="#{eventBean.selectedEvent}" />
        </p:commandButton>
    </p:column>
</p:dataTable>
<h:form id="viewPersonsForm">
    <p:dialog modal="true" widgetVar="viewPersonsDlg" dynamic="true" header="#{eventBean.selectedEvent.name}" >
        ...
    </p:dialog>
</h:form>

这是新的 xhtml,带有未调用的 eventBean#setSelectedEvent()。

<p:dataTable var="event" value="#{eventBean.lazyModel}" selection="#{eventBean.selectedEvent}" />
    ...
    <p:column headerText="#{msgs.Persons}">
        <p:commandButton value="#{msgs.ViewPersons}" update=":viewPersonsDlgId" oncomplete="jQuery('#viewPersonsDlgId .ui-dialog-title').text('#{eventBean.selectedEvent.name}');viewPersonsDlg.show()"> 
            <f:setPropertyActionListener value="#{event}" target="#{eventBean.selectedEvent}" />
        </p:commandButton>
    </p:column>
</p:dataTable>
<p:dialog modal="true" id="viewPersonsDlgId" widgetVar="viewPersonsDlg" dynamic="true" >
    ...
</p:dialog>

那么,为什么在第二种情况下 eventBean#setSelectedEvent() 没有被调用?并且,如果可能的话,为什么第一种情况不是最优的?

【问题讨论】:

    标签: jsf primefaces


    【解决方案1】:

    不限于在h:form 中使用p:dialog,因为它在某些情况下可以工作,但大多数时候你会发现自己在为一些意想不到的行为而苦恼,这里有一些解释:

    Why not to place p:dialog inside h:form 1

    Why not to place p:dialog inside h:form 2

    您的问题是oncomplete 中的jQuery 方法在使用f:setPropertyActionListener 设置值之前被调用。为避免这种情况,请使用与第一种情况相同的解决方案。所以:

    <p:dataTable var="event" value="#{eventBean.lazyModel}" selection="#{eventBean.selectedEvent}" />
        ...
        <p:column headerText="#{msgs.Persons}">
            <p:commandButton value="#{msgs.ViewPersons}" update=":viewPersonsDlgId" oncomplete="viewPersonsDlg.show()"> 
                <f:setPropertyActionListener value="#{event}" target="#{eventBean.selectedEvent}" />
            </p:commandButton>
        </p:column>
    </p:dataTable>
    <p:dialog modal="true" id="viewPersonsDlgId" widgetVar="viewPersonsDlg" dynamic="true" header="#{eventBean.selectedEvent.name}" >
        ...
    </p:dialog>
    

    这里不需要使用jQuery。

    【讨论】:

    • 感谢您的链接。不幸的是,即使您进行了设置,setter 也没有被触发。
    • 我已经测试过了,它工作正常。如果没有为您触发 setter,则 JSF 循环阶段之一失败。将&lt;h:messages&gt; 添加到您的页面并检查错误。
    • 太棒了,它也解决了我的问题:)。非常感谢:)
    【解决方案2】:

    我遇到了同样的问题(pf 3.5):

    <p:tabView id="cashFlowTabContainer" style="width:100%" activeIndex="0"
        widgetVar="cashFlowTabContainerVar">
        <p:tab title="#{labels['cashflow_incoming']}">
            <p:outputPanel id="incomingPanel">
                <p:dataTable value="#{cashFlowController.incomingCashFlows}"
                    var="cashFlow">
    <p:column headerText="#{labels.cashflow_actions}">
                        <p:commandButton value="Edit"
                            action="#    {cashFlowController.editIncoming}" update="@form" oncomplete="editInputVar.show();">
                            <f:setPropertyActionListener     value="#{cashFlow}"
                                target="#{cashFlowController.selectedIncoming}" />
                        </p:commandButton>
                    </p:column>
    

    这是我的对话:

    <p:dialog id="editInput" header="Dynamic Dialog"
        widgetVar="editInputVar" resizable="false" draggable="false"
        modal="true">
        <p:panel>
            <h:panelGrid columns="2" cellpadding="5">
    ...
    <h:outputText value="#{labels.cashflow_description}:" />
                <h:inputText
                    value="#{cashFlowController.selectedIncoming.description}" />
    

    所以... 这样 setter 永远不会被调用。然后我注意到,如果我清空对话框,就会调用 setter。

    所以我通过在面板上放置“渲染”语句来解决它:

    <p:dialog id="editInput" header="Dynamic Dialog"
        widgetVar="editInputVar" resizable="false" draggable="false"
        modal="true">
        <p:panel **rendered="#{cashFlowController.selectedIncoming != null}"**>
            <h:panelGrid columns="2" cellpadding="5">
    

    我猜有一个空指针没有记录在任何地方......无论如何它是这样工作的:)

    【讨论】:

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