5

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>

では、繰り返しになりますが、2番目のシナリオでeventBean#setSelectedEvent()が呼び出されないのはなぜですか?そして、可能であれば、なぜ最初のシナリオが最適ではないのですか?

4

2 に答える 2

4

p:dialog場合によっては機能する可能性があるため、内部での使用に制限されていません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>

ここでjQueryを使用する必要はありません。

于 2012-05-16T20:33:04.427 に答える
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}" />

だから...このようにセッターは決して呼ばれませんでした。次に、ダイアログを空にすると、セッターが呼び出されることに気付きました。

そこで、パネルに「レンダリングされた」ステートメントを配置することで解決しました。

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

I guess there's a null pointer that is not logged anywhere... anyway this way it works :)

于 2013-07-24T10:00:02.727 に答える