2017-10-05 17 views
0

値が現在空またはnullの場合、基本的に2つの入力フィールドIが表示されます。そうでなければ、私はoutputTextを表示します。これらの2つの値は、Longオブジェクトに格納されている通貨の値であり、データを正しく表示するためにコンバーターを使用します(PrimeFaces 5.3を使用しているので、PrimeFacesのinputNumberは使用できません)。JSFでコンバーターとajaxを使用してフィールドを更新する方法

<c:set var="edtVal1" value="#{bean.val1 ne null and bean.val1 ne 0}" scope="request" /> 
<c:set var="edtVal2" value="#{bean.val2 ne null and bean.val2 ne 0}" scope="request" /> 

<p:panelGrid> 
    <p:row> 
     <p:column colspan="2"> 
      <p:messages id="mainMessages" globalOnly="false" autoUpdate="true" showDetail="true" /> 
     </p:column> 
    </p:row> 
    <!-- [...] --> 

    <p:row> 
     <p:column styleClass="col-quarter col-label2"> 
      <h:outputText value="value 1" /> 
     </p:column> 
     <p:column styleClass="col-quarter col-value2" rendered="#{edtVal1}"> 
      <h:outputText id="val1Output" value="#{bean.val1}" converter="myConverter" /> 
     </p:column> 
     <p:column styleClass="col-quarter" rendered="#{not edtVal1}"> 
      <p:inputText id="val1Input" value="#{bean.val1}" converter="myConverter"> 
       <p:ajax update="mainMessages val1Input" event="change" /> 
      </p:inputText> 
     </p:column> 
    </p:row> 
    <p:row> 
     <p:column styleClass="col-quarter col-label2"> 
      <h:outputText value="value 2" /> 
     </p:column> 
     <p:column styleClass="col-quarter col-value2" rendered="#{edtVal2}"> 
      <h:outputText id="val1Output" value="#{bean.val2}" converter="myConverter" /> 
     </p:column> 
     <p:column styleClass="col-quarter" rendered="#{not edtVal2}"> 
      <p:inputText id="val1Input" value="#{bean.val2}" converter="myConverter"> 
       <p:ajax update="mainMessages val1Input" event="change" /> 
      </p:inputText> 
     </p:column> 
    </p:row> 
</p:panelGrid> 

私はこのようにそれを置くとき、コンバータによってスローされたメッセージが表示されますが、フィールドのどれも更新されません:私の問題は次のようです。私は両方の入力/出力オプションの同じブール変数を使用する場合は、これと同様に(両方でedtVal2を使用する1rstデータ列のrendered属性で使用される変数を変更):

<p:row> 
    <p:column styleClass="col-quarter col-label2"> 
     <h:outputText value="value 1" /> 
    </p:column> 
    <p:column styleClass="col-quarter col-value2" rendered="#{edtVal1}"> 
     <h:outputText id="val1Output" value="#{bean.val1}" converter="myConverter" /> 
    </p:column> 
    <p:column styleClass="col-quarter" rendered="#{not edtVal1}"> 
     <p:inputText id="val1Input" value="#{bean.val1}" converter="myConverter"> 
      <p:ajax update="mainMessages val1Input" event="change" /> 
     </p:inputText> 
    </p:column> 
</p:row> 

、第1フィールドの更新成功と2度目はまだ動作しません。

フォーマッティングされたデータを表示するためにコンバータを使用することは私が既に行った回避策であり、期待どおりに機能し、以前と同じコンバータを使用します。しかし、今回は、なぜ動作していないのか分かりません。

この問題を再現するためにはコンバータが重要ですが、カスタムコンバータがその役割を果たしているようです。

+0

あなたのタイトルを真剣に改善する必要があります... [尋ねる]を読んで、良いタイトルを書く方法に関する提案が含まれています。そして、[mcve]とhttp://www.stackoverflow.com/tags/jsf/infoを読んでください。 – Kukeltje

+0

質問はかなり長いですが、それは最小です:私の問題はぼやけた原因があり、私は2時間それを解決しようとした。私はこの質問が特に質問を可能な限り正確に定式化するために努力して、下降気味に値するとは思わない。 – Sirmyself

+0

しかし、最初の「panelgrid」と第2の「panelgrid」の違いを説明するテキストを追加する必要があります。違いを見つけるのを手伝ってくれる人達に任されており、それは[mcve]ではありません;-) – Kukeltje

答えて

0

任意の他の解決策はまだこの記事に歓迎されているが、私は働いて解決策を見つけるために管理:

私は定数文字列にrendered属性を変更したときに、問題が存在しませんでした。だから私は問題が<c:set>の誤解から来ると思う。

私の解決策は、Beanをコントローラとして使用することでした。変数をxhtmlファイルからコントローラのプロパティに変更したところ、すべて正常に動作しました。だから私は<c:set>を私のxhtmlから削除して、そのページに適切なMVCパターンを使用するようになりました。


注:これは明らかに、ユーザーインターフェイスと操作されたデータを分割きちんと建築のパターンです:MVCが何であるかを知らない人のために
。詳細はon wikipediaをご覧ください。