f:未调用setPropertyActionListener

per*_*ssf 5 jsf primefaces

我试图p:dialog移出一个h:form,因为我已经读到这是首选方式(但我想了解原因,因为我的p:dialog内部form在我的应用程序中运行良好).

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

这是我的旧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>
Run Code Online (Sandbox Code Playgroud)

这是新的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>
Run Code Online (Sandbox Code Playgroud)

那么,再次,为什么在第二个场景中没有调用eventBean #setSelectedEvent()?并且,如果可能,为什么第一种情况不是最优的?

Fal*_*lup 4

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

为什么不放在1p:dialog里面h:form

为什么不放在2p:dialog里面h:form

您的情况的问题是,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>
Run Code Online (Sandbox Code Playgroud)

这里不需要使用 jQuery。