2011-12-30 13 views
14

मुझे <p:inputText> की सत्यापन और इसकी सामग्री को अपडेट करने में कोई समस्या है।प्रमाणीकरण के बाद प्राइमफ़ेस जेएसएफ अपडेट विफल नहीं हुआ

मूल रूप से जब इनपुट टेक्स्ट सत्यापन विफल रहता है, तो यह कभी भी अपडेट नहीं होता है।

Facelet:

यहाँ स्पष्ट करने के लिए एक सरल उदाहरण है

!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 पर क्लिक करते हैं रों इनपुट फ़ील्ड अपडेट हो जाता है, लेकिन जब कोई सत्यापन विफल रहता है (बस इनपुट टेक्स्ट को खाली छोड़ दें, और पृष्ठ के किसी भी अन्य भाग पर क्लिक करें), इनपुट की सीमा लाल हो जाती है। उसके बाद उपर्युक्त कमांड लिंक्स पर क्लिक करते समय इसे फिर से अपडेट नहीं किया जाता है।

कोई विचार?

उत्तर

9

Arjan tijms जवाब काम करता है, फिर भी सबसे अच्छा समाधान मैंने पाया हैं जाएगा:

  1. उपयोग Omnifaces Solution तो, श्रोता को अपना स्वयं लागू करने के बजाय आपको बस इतना ही सरल कोड की एक पंक्ति है।

    <h:commandButton value="Update" action="#{bean.updateOtherInputs}"> 
    <f:ajax execute="currentInputs" render="otherInputs" /> 
    <f:actionListener type="org.omnifaces.eventlistener.ResetInputAjaxActionListener" /> 
    </h:commandButton> 
    
  2. आप Primefaces उपयोग कर रहे हैं आप 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

यह 'इनपुट तत्व' (EditableValueHolder एस वास्तव में) का कुख्यात मामला है कि एक बार सत्यापन उनके लिए विफल हो जाने के बाद AJAX पुनः प्रतिपादन के माध्यम से फिर से अपडेट नहीं किया जा सकता है।

देखें:

  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

मैं खुद का जवाब दूंगा।

अर्जुन द्वारा प्रदान किए गए लिंक के आधार पर, मैं फॉर्म तत्वों को साफ करने के लिए 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; 
    } 

} 
संबंधित मुद्दे