2011-12-30 2 views
14

내가이 (가) <p:inputText>의 검증 및 컨텐츠를 업데이트에 문제가 작동하지 않습니다 실패했습니다. InputText]를 검증이 실패한 경우Primefaces JSF 업데이트는

기본적으로, 다시 업데이트되지 없구요.

!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui"> 
    <h:head> 
    </h:head> 
    <body> 
    <h1>Test</h1> 

     <h:form id="list" prependId="false"> 
      <ul> 
       <li>Element 1&#160; 
        <p:commandLink action="#{Test.assignElement}" update="detail_value"> 
         <f:setPropertyActionListener target="#{Test.currentElement}" value="1" /> 
         Assign 
        </p:commandLink> 
       </li> 
       <li>Element 2&#160; 
        <p:commandLink action="#{Test.assignElement}" update="detail_value"> 
         <f:setPropertyActionListener target="#{Test.currentElement}" value="2" /> 
         Assign 
        </p:commandLink> 
       </li> 
      </ul> 
     </h:form> 

     <h:form id="detail" prependId="false"> 
      <p:inputText value="#{Test.element}" id="detail_value" required="true" styleClass="#{Faces.messagesFor['detail_value'] ? 'border:1px solid red' : ''}"> 
       <p:ajax event="blur" update="detail_value"></p:ajax> 
      </p:inputText> 
     </h:form> 
    </body> 
</html> 

테스트 콩 :

package com.easydevel.test; 

public class Test { 

    private String currentElement; 
    private String element; 

    public String getCurrentElement() { 
     return currentElement; 
    } 

    public void setCurrentElement(String currentElement) { 
     this.currentElement = currentElement; 
    } 

    public String getElement() { 
     return element; 
    } 

    public void setElement(String element) { 
     this.element = element; 
    } 

    public String assignElement(){ 
     setElement(getCurrentElement()); 
     return ""; 
    } 

} 

는 "요소"아래 commandLinks 클릭하면

의 입력

Facelet : 여기

는 명확히하기 위해 간단한 예제 필드가 업데이트되지만 유효성 검사가 실패하면 (단순히 입력 텍스트를 비워두고 페이지의 다른 부분을 클릭하면) 입력 테두리가 빨간색으로 바뀝니다. 그 후 위에서 언급 한 commandLinks를 클릭하면 다시 업데이트되지 않습니다.

아이디어가 있으십니까?

답변

9

Arjan tijms 대답은 작품,하지만 내가 찾은 최고의 솔루션입니다됩니다

  1. 사용 Omnifaces Solution 그래서 리스너를 구현하는 대신에 필요한 모든 것은 간단한 코드 한 줄에 불과합니다.당신이 Primefaces를 사용하는 경우

    <h:commandButton value="Update" action="#{bean.updateOtherInputs}"> 
    <f:ajax execute="currentInputs" render="otherInputs" /> 
    <f:actionListener type="org.omnifaces.eventlistener.ResetInputAjaxActionListener" /> 
    </h:commandButton> 
    
  2. 당신은 resetInput component 사용할 수 있습니다

    <p:commandButton value="Reset Non-Ajax" actionListener="#{resetInputView.reset}" 
    immediate="true" ajax="false" style="margin-right:20px;"> 
    <p:resetInput target="panel" /> 
    </p:commandButton> 
    
5

이 유효성 검사가 그들을 위해 실패하면 AJAX 재 렌더링을 통해 다시 업데이트되지 않을 수있다 '입력 요소'의 악명 높은 경우 (EditableValueHolder 실제로 S)입니다.

은 참조 :

  1. JSF AJAX validation: execute="@this" render="@form" inconsistent depending on prior requests
  2. How can I populate a text field using PrimeFaces AJAX after validation errors occur?
  3. http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-1060

업무와 주위를 다시 렌더링 할 수있는 구성 요소를 재설정 액션 리스너를 만드는 것입니다. http://community.jboss.org/message/620000

이 동작으로 인해 귀찮게 여겨지면 JAVASERVERFACES_SPEC_PUBLIC-1060에 투표하는 것을 망설이지 말고 가능한 경우 예상 한 내용과 이유를 설명하는 의견을 남겨주십시오.

3

나는 스스로 대답 할 것이다.

는 Arjan 의해 제공되는 링크에 기초하여, 난의 actionListener 폼 요소를 정리 개발. 그것은 작동합니다.

FACELET :

<p:commandLink action="#{Test.assignElement}" update="detail_value"> 
         <f:actionListener type="com.easydevel.utils.CleanForms" /> 
         <f:setPropertyActionListener target="#{Test.currentElement}" value="1" /> 
         Assign 
</p:commandLink>  

청취자 ....

package com.easydevel.utils; 

import java.util.Collection; 
import java.util.Iterator; 
import javax.faces.component.EditableValueHolder; 
import javax.faces.component.UIComponent; 
import javax.faces.context.FacesContext; 
import javax.faces.context.PartialViewContext; 
import javax.faces.event.AbortProcessingException; 
import javax.faces.event.ActionEvent; 
import javax.faces.event.ActionListener; 


public class CleanForms implements ActionListener { 

public void processAction(ActionEvent event) throws AbortProcessingException {     
    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    PartialViewContext ajaxContext = facesContext.getPartialViewContext(); 
    UIComponent root = facesContext.getViewRoot();   
    Collection<String> renderIds = ajaxContext.getRenderIds(); 
    for (String renderId : renderIds) { 
     UIComponent form = findComponent(root,renderId); 
     if (form != null) { 
      clearComponentHierarchy(form); 
     } 
    } 
} 

private void clearComponentHierarchy(UIComponent pComponent) { 

     if (pComponent.isRendered()) { 

      if (pComponent instanceof EditableValueHolder) { 
       EditableValueHolder editableValueHolder = (EditableValueHolder) pComponent; 
       editableValueHolder.setSubmittedValue(null); 
       editableValueHolder.setValue(null); 
       editableValueHolder.setLocalValueSet(false); 
       editableValueHolder.setValid(true); 
      }   

      for (Iterator<UIComponent> iterator = pComponent.getFacetsAndChildren(); iterator.hasNext();) { 
       clearComponentHierarchy(iterator.next()); 
      }   

     } 
} 

private static UIComponent findComponent(UIComponent base, String id) { 
     if (id.equals(base.getId())) 
     return base; 
     UIComponent kid = null; 
     UIComponent result = null; 
     Iterator kids = base.getFacetsAndChildren(); 
     while (kids.hasNext() && (result == null)) { 
     kid = (UIComponent) kids.next(); 
     if (id.equals(kid.getId())) { 
      result = kid; 
      break; 
     } 
     result = findComponent(kid, id); 
     if (result != null) { 
      break; 
     } 
     } 
     return result; 
    } 

} 
관련 문제