2017-10-05 32 views
0

기본적으로 값이 현재 비어 있거나 null 인 경우 기본적으로 두 개의 입력 필드가 표시됩니다. 그렇지 않으면 outputText를 표시합니다. 이 두 값은 Long 객체에 저장된 통화 값이며 데이터를 제대로 표시하기 위해 변환기를 사용합니다 (PrimeFaces 5.3을 사용하고 있기 때문에 PrimeFaces의 inputNumber를 사용할 수 없습니다). 내 문제는 다음과 같습니다.JSF에서 변환기와 아약스를 사용하여 필드를 업데이트하는 방법

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

이렇게하면 변환기에서 발생하는 메시지가 표시되지만 필드가 업데이트되지 않습니다. I는 모두 입력/출력 옵션 같은 부울 변수를 사용하는 경우에는,과 같이 (모두 edtVal2을 사용할 1rst 데이터 열의 rendered 속성에 사용되는 변수 변경) : 제 1 필드 갱신 성공적

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

및 두 번째는 여전히 작동하지 않습니다.

형식화 된 데이터를 표시하기 위해 변환기를 사용하면 이미 완료되었으며 예상대로 작동하고 이전과 같은 변환기를 사용합니다. 하지만 이번에는 왜 작동하지 않는지 이해할 수 없습니다.

변환기는 문제를 재현하는 데 중요하지만 모든 사용자 지정 변환기가 작업을 수행하는 것으로 보입니다.

+0

당신의 타이틀을 진지하게 개선해야합니다 ... [질문]을 읽으십시오, 좋은 제목을 쓰는 방법에 대한 제안이 포함되어 있습니다. 그리고 [mcve] 및 http://www.stackoverflow.com/tags/jsf/info를 읽으십시오. – Kukeltje

+0

질문에 상당히 동의하지만 최소한입니다 : 내 문제는 흐린 원인으로 2 시간 동안 풀려고했습니다. . 나는이 질문이 downvote를받을 가치가 있다고 생각하지 않는다. 특히 나는 가능한 한 정확하게 질문을 공식화하기 위해 노력했다. – Sirmyself

+0

하지만 여전히 첫 번째와 두 번째 'panelgrid'의 차이점을 설명하는 텍스트를 추가해야합니다. 차이점을 찾기 위해 기꺼이 도와 줄 사람들에게 달려 있습니다. – Kukeltje

답변

0

다른 솔루션은 아직이 게시물에 오신 것을 환영합니다,하지만 난 작업 솔루션 찾기 위해 관리 : 내가 상수 문자열로 rendered 속성을 변경

이 문제가 결석을. 그래서 문제는 <c:set>의 오해에서 비롯된 것이라고 생각합니다.

제 해결책은 빈을 컨트롤러로 사용하는 것입니다. 변수를 xhtml 파일에서 컨트롤러의 속성으로 변경했는데 이제는 모든 것이 잘 작동합니다. 그래서 내 xhtml에서 <c:set>을 모두 제거하고 해당 페이지에서 적절한 MVC 패턴을 사용합니다.


참고 :이 명확하게 사용자 인터페이스와 조작 데이터를 분할 깔끔한 아키텍처 패턴입니다 : MVC가 무엇인지 모르는 사람들을 위해
. 더 알아보기 on wikipedia.