2015-01-21 3 views
1

제출 후 입력을 설정하는 순서를 지정하는 방법이 있습니까? 여기 JSF 입력 처리 순서

내 경우입니다 :

I가 발생하고이 문제는 입력이 선언되고 주문 처리되므로, fieldA 및 fieldB가 다음 인 myObject의 초기 인스턴스에서 설정되어 있다는 점이다
<h:inputText id="fieldA" value=#{myBean.myObject.fieldA}" /> 
<h:inputText id="fieldB" value=#{myBean.myObject.fieldB}" /> 
<p:autoComplete id="myObject" value=#{myBean.myObject" converter="myObjectConverter" /> 
<h:inputText id="fieldC" value=#{myBean.myObject.fieldD}" /> 
<h:inputText id="fieldD" value=#{myBean.myObject.fieldC}" /> 

인 myObject 따라서 filedA와 fieldB 값이 손실되므로 새로운 인스턴스로 필드 C와 fieldD는 아무 문제없이 설정됩니다.

먼저 myObject를 설정하여 시작할 수 있다면 문제가 해결 될 수 있습니다.

필드와 myObject를 일시적으로 my bean의 두 가지 속성으로 설정하고 저장 버튼을 클릭 한 후 myObject를 채 웁니다. 그러나 실제 솔루션보다 해킹처럼 보입니다.

inputtexts 전에 자동 완성을 선언하는 것이 옵션이 아니라는 것은 말할 필요도 없습니다.

미리 감사드립니다.

+0

그런 경우에, 나는 보통'fieldA'와'fieldB' (그리고'fieldC'와'fieldD')를 myBean의 속성으로 정의하고 그 값을 컨트롤러에서 객체에 액세스 할 때 myObject가 발생했습니다. – SJuan76

+0

이전의 (wortless) 답변을 업데이트했습니다. :) –

답변

0

바로 가기 있음 : <p:inputText> 태그를 사용할 수 있습니다. 그런 다음 모든 입력을 비활성화 할 수 있습니다. autoComplete에 ajax를 추가하고 autoComplete를 처리 한 후 다른 입력을 업데이트하십시오. 입력 disable은 autoComplete가 null이 아닌지 여부에 따라 설정할 수 있습니다. 이렇게하면 사용자가 자동 ​​완성을 먼저 입력하게됩니다.

0

당신이 모든 다른 구성 요소 전에 APPLY_REQUEST_VALUES 단계에서 처리 될 수 있도록, p:autocompleteimmediate="true"를 설정하려고 할 수 있습니다 .

간단한 해결책은 p:autocomplete 항목의 값을 반영하도록 선택된다 h:inputText의 업데이트한다 :

<p:autoComplete id="myObject" value="#{myBean.myObject}" ...> 
    <p:ajax event="itemSelect" process="@this" update="fieldA fieldB fieldC fieldD" /> 
</p:autoComplete> 

을 그러나 이것은 h:inputText들에 대한 사용자 입력을 복귀한다. 그리고 당신이 위로 이동 p:autocomplete 수 없기 때문에, 아마도 이것도 허용되지 않습니다.

이 경우 당신은/당신이 초기 모델 업데이트를 강제 할 수 아약스를 사용하지 않을 수 없습니다

<p:autoComplete id="myObject" value="#{myBean.myObject}" immediate="true" 
    valueChangeListener="#{component.updateModel(facesContext)}" ... /> 

하지만를, 내 의견으로는,이 ...

친절한 매우 사용자가 아닙니다

PS 이번에는 테스트되었습니다 :)

+0

죄송합니다. 올바른 시간은 2 번입니다. –

+0

안녕 Michele, p : autocomplete는 항상 선택 가능하지 않습니다. 기존 엔티티가 선택되지 않은 경우 새 엔티티를 만들어야하므로 선택을 할 수 없습니다. 자동 완성에서 추천을 선택하지 않으면 입력 값이 반환됩니다. 지속될 새로운 인스턴스를 생성하는 변환기와 마찬가지입니다. 또한 자동 완성 제안이 선택되고 해당 입력이 업데이트 된 경우에도 동일한 입력을 통해 입력란 (fieldA-D) 중 하나를 업데이트 할 수 있어야합니다. – Riccati

+0

변환기 코드와 완전 자동 완성 태그를 게시 할 수 있습니까? –

0

이 문제를 해결할 수있는 방법은 없습니다. 귀하의 상황은 이미 이상적이지 않고 해킹입니다 (다시 말해서 필드를 재정렬 할 수는 없습니다). 한 가지 해결 방법은 fieldAfieldBmyObject의 특성으로 설정하는 것입니다. 그러면 변환기에서 값을 구성 요소에서 끌어낼 수 있습니다.

  1. 세트

    <h:inputText id="fieldA" binding=#{fieldA}" /> 
    <h:inputText id="fieldB" binding=#{fieldB}" /> 
    <p:autoComplete id="myObject" value=#{myBean.myObject" converter="myObjectConverter"> 
        <f:attribute name="fieldA" value="#{fieldA}"/> 
        <f:attribute name="fieldB" value="#{fieldB}"/> 
    </p:autoComplete> 
    

    따라서 속성을 발견했을 binding 속성은 다음 계산기

    에서 그 변수의 값을 취득하여 p:autocomplete

  2. 에 속성으로 전달할 수 있도록 효과적으로 turns those components into page-scoped variables,

    //Retrieve the fields and cast to UIInput, necessary 
    //to retrieve the submitted values 
    UIInput fieldA = (UIInput) component.getAttributes().get("fieldA"); 
    UIInput fieldB = (UIInput) component.getAttributes().get("fieldB"); 
    
    //Retrieve the submitted values and do whatever you need to do 
    String valueA = fieldA.getSubmittedValue().toString(); 
    String valueB = fieldB.getSubmittedValue().toString(); 
    

더 중요한 것은 양식의 필드/논리적 흐름을 재정렬 할 수없는 이유는 무엇입니까?? 이 모든 불쾌한 사업을 피할 수있다.