2012-02-03 1 views
0

가지고있는 양식에 문제가 있습니다. 이 양식을 사용하면 사용자가 텍스트 상자에 정보를 입력 한 다음 검색 및 재설정 버튼 2 개가 있습니다.양식을 지우는 JS 기능을 실행하는 버튼을 클릭 한 후보기를 복원 할 수 없습니다.

양식 코드 :

<h:outputText value="Search by Author Name" styleClass="p" /> 

<div class="investigatorTab"> 

    <h:outputLabel for="firstName" rendered="true" value="First Name" /> 
    <h:inputText value="#{pubBacker.firstName}"></h:inputText> 

    <h:outputLabel for="lastName" rendered="true" value="Last Name" /> 
    <h:inputText value="#{pubBacker.lastName}"></h:inputText> 

</div> 

<div class="buttons"> 
    <p:commandButton value="Submit" styleClass="submitButton" action="#{pubBacker.submit}" update="tabs" /> 
    <p:commandButton value="Reset" type="button" actionListener="#{pubBacker.clearEntries}" onclick="clearForm(this.form);" /> 
</div> 

제가하는 데 문제는 내가 검색 버튼을 클릭하면 결과 페이지에 저를 받아 내가 검색 페이지로 돌아 가면, 그것은 여전히있다이다 bean은 세션 범위가 있기 때문에 텍스트 필드에서 검색 한 데이터. 재설정 버튼을 클릭하고 텍스트 입력란의 데이터를 지울 수 있기를 원합니다. 내가 재설정 버튼을 클릭하면 현재 아래의 코드와

는, 검색 버튼이 더 이상 작동하고 불을 지르고 내가 두 번째 p:commandButton에서 onclick="clearForm(this.form);"을 제거하면 그것은 나에게이 오류

<?xml version='1.0' encoding='UTF-8'?> 
<partial-response><error><error-name>class javax.faces.application.ViewExpiredException</error-name><error-message><![CDATA[viewId:/ccadmin/pubManagement.xhtml - View /ccadmin/pubManagement.xhtml could not be restored.]]></error-message></error></partial-response> 

을 제공 콘솔, 양식이 잘 작동합니다.

JS 함수를 호출하면 뷰가 만료되는 이유는 무엇입니까?

출판 콩 :

@ManagedBean(name="pubBacker") 
@SessionScoped 
public class Publication { 

    public Publication() {} 

    public void clearEntries() { 
     new Publication(); 
    } 
} 

답변

1

당신은 분명히 맹목적으로 form.elements 통해 반복하여 양식의 모든 요소를 삭제하고 있습니다. 이렇게하면 JSF에 의해 자동 포함되는 javax.faces.ViewState 숨겨진 입력 필드도 지워 지므로 JSF는 빈 값을 검색하고 서버 측에서 연관된 뷰 상태를 찾을 수 없습니다. 결국 궁극적으로는 ViewExpiredException으로 끝납니다.

JS를 사용하지 말고 JSF 만 사용하는 것이 좋습니다. 양식을 나타내는 모델을 가지고 있으면 더 쉽습니다. 내가 샘플로 내 질문을 편집 한

public void clear() { 
    pub = new Pub(); 
} 
+0

<div class="investigatorTab"> <h:outputLabel for="firstName" rendered="true" value="First Name" /> <h:inputText value="#{pubBacker.pub.firstName}"></h:inputText> <h:outputLabel for="lastName" rendered="true" value="Last Name" /> <h:inputText value="#{pubBacker.pub.lastName}"></h:inputText> </div> <div class="buttons"> <p:commandButton value="Submit" styleClass="submitButton" action="#{pubBacker.submit}" update="tabs" /> <p:commandButton value="Reset" action="#{pubBacker.clear}" process="@this" update="@form" /> </div> 

과 함께합니다 (process="@this"주의이이를 확인하지 따라서 폼의 입력 값을 처리하지 않습니다) 내 게시자. 이것은 바보 같은 질문 일지 모르지만,'pub = new publication();'을 호출하여 pubBacker bean을 인스턴스화 한 적이 없다면, clearEntries 메소드에서'new Publication()'이라고 말하는 것이 옳은가요? – Catfish

+0

당신이 날 이해하지 못했을 것 같아요. ''구성 요소의 값을보십시오. 컨트롤러에서 모델을 추출하고 싶지 않다면, clear 메소드 안의'firstName = lastName = null; '도 괜찮습니다. 그러나 많은 것을 가지고 있다면 성가신 것입니다. – BalusC

+0

오 이전에 수정 된 inputText를 보지 못했습니다. 소수의 필드를 가지고 있기 때문에, 나는 단지 ""으로 나의 vars를 설정했다. 그러나 내가 가지고 있지 않은 것은'update = "@ form"'이고 commandButton에'type'이 설정되어 있다면, 그것은 작동하지 않았다. – Catfish

관련 문제