2012-05-16 9 views
5

を呼び出しません私のアプリケーション)。F:setPropertyActionListener私はこれが原因<code>form</code>作品内の私の<code>p:dialog</code>は、ウェル内(ただし、私は、その理由を理解したいと思い好ましい方法であることを読んだので、私は、<code>h:form</code>の外に<code>p:dialog</code>を移動しようとしています

唯一の難点は、ダイアログタイトルを動的に更新する必要があることです。 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> 

そして、ここではeventBean#setSelectedEvent持つ新しいXHTMLは、(ある)が呼び出されません。

<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

ここでは、それはいくつかのケースで作業することができますので、h:formp:dialogを使用するように制限されていませんが、ほとんどの時間は、あなた自身がそれでいくつかの予期しない動作に苦しんでいますが、いくつかの説明です:

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

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

あなたの場合の問題点は、値がf:setPropertyActionListenerで設定される前oncompleteでjQueryのメソッドが呼び出されるということです。これを回避するには、最初のケースで使用したのと同じソリューションを使用します。したがって:

<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を使用する必要はありません。

+0

を推測リンクありがとう。残念なことに、セッターはセットアップしても起動しません。 – perissf

+1

私はそれをテストして正常に動作しています。設定者があなたのために起動されない場合、JSFサイクルフェーズの1つが失敗しました。ページに ''を追加し、エラーをチェックしてください。 – Fallup

+0

あなたは正しいです、問題はどこか他のところです。私はさらに調査してみましょう... – perissf

2

私は(3.5 PF)同じ問題を抱えていた:

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

私はとにかく...どこにもログインしていないNULLポインタがあります、それは動作します。この方法:)

+0

これは働いた。しかし、奇妙な問題 – Makky