f:未调用setPropertyActionListener

时间:2012-05-16 19:03:23

标签: jsf primefaces

我正在尝试将p:dialog移出h:form,因为我已经读过这是首选方式(但我想了解原因,因为我的p:dialog } form内部适用于我的应用程序)。

唯一的困难是对话标题需要动态更新。单击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()?并且,如果可能的话,为什么第一种情况不是最优的?

2 个答案:

答案 0 :(得分:4)

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

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。

答案 1 :(得分:2)

我遇到了同样的问题(参见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。

所以我通过在面板上放置一个“呈现”语句来解决它:

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

我猜有一个空指针没有记录在任何地方......无论如何它都可以工作:)