2011-04-14 77 views
0

我已經創建了一個自定義組件,並且下面是組件的渲染器,在啓動組件時得到渲染確定,但AjaxOuputPanel永遠不會再得到每個Ajax請求的渲染......那麼,什麼是與代碼Richfaces自定義組件渲染器問題

也是在那個添加型HtmlAjaxOutputPanel的子組件的任何組件的情況下重複的問題,組件呈現在正常開始,但阿賈克斯走出面板不會再呈現...組件代碼:

包eg.com.etisalat.web.rich.components.inputtext;

import java.io.IOException; 

import javax.el.ELContext; 
import javax.el.ExpressionFactory; 
import javax.faces.application.Application; 
import javax.faces.component.UIComponent; 
import javax.faces.component.html.HtmlGraphicImage; 
import javax.faces.component.html.HtmlInputText; 
import javax.faces.context.FacesContext; 
import javax.faces.context.ResponseWriter; 

import org.ajax4jsf.component.UIAjaxOutputPanel; 
import org.ajax4jsf.component.html.HtmlAjaxOutputPanel; 
import org.ajax4jsf.renderkit.AjaxComponentRendererBase; 

public class InputTextRenderer extends AjaxComponentRendererBase { 

    @SuppressWarnings({ "rawtypes", "unchecked" }) 
    @Override 
    protected Class getComponentClass() { 
     return eg.com.etisalat.web.rich.components.inputtext.HtmlInputText.class; 
    } 

    public void doEncodeBegin(ResponseWriter writer, FacesContext context, 
      UIComponent component) throws IOException { 

     ELContext elContext = context.getELContext(); 
     Application app = context.getApplication(); 
     ExpressionFactory exprFactory = app.getExpressionFactory(); 

     String clientId = component.getClientId(context); 
     String componentId = component.getId(); 
     component.getChildren().clear(); 

     String readonly = (String) component.getAttributes().get(Constants.ATT_READ_ONLY); 
     String styleClass = (String) component.getAttributes().get(Constants.ATT_STYLE_CLASS); 
     String required = (String) component.getAttributes().get(Constants.ATT_REQUIRED); 
     String requiredMessage = (String) component.getAttributes().get(Constants.ATT_REQUIRED_MESSAGE); 

     writer.startElement("div", component); 
     getUtils().writeAttribute(writer, "id", clientId); 

     String inputFieldId = componentId + "InputField"; 

     javax.faces.component.html.HtmlInputText inputTextCom = new HtmlInputText(); 
     inputTextCom.setId(inputFieldId); 

     inputTextCom.setOnchange(inputFieldId + "StoredValue = this.value"); 

     if (null != readonly) inputTextCom.setReadonly(Boolean.parseBoolean(readonly)); 
     if (null != styleClass) inputTextCom.setStyleClass(styleClass); 
     if (null != required) inputTextCom.setRequired(Boolean.parseBoolean(required)); 
     if (null != requiredMessage) inputTextCom.setRequiredMessage(requiredMessage); 

     component.getChildren().add(inputTextCom); 

     if(null != required && Boolean.parseBoolean(required)) { 
      HtmlAjaxOutputPanel outpanel = new HtmlAjaxOutputPanel(); 
      outpanel.setId(componentId + "InputFieldValidation"); 
      outpanel.setAjaxRendered(true); 

      HtmlGraphicImage icon = new HtmlGraphicImage(); 
      icon.setUrl((String)exprFactory.createValueExpression(elContext, "" + 
        "#{(not empty webUtil.messagesMap['" + inputFieldId + "']) ? '/images/info_red_16_16_.png' : " + 
          "'/images/info_yellow_16_16_.png'}" 
        , String.class).getValue(elContext)); 
      icon.setStyleClass("errorIcon"); 
      icon.setTitle(requiredMessage); 

      outpanel.getChildren().add(icon); 
      component.getChildren().add(outpanel); 
     } 

     String elementId = inputTextCom.getClientId(context); 

     writer.startElement("script", component); 
     writer.writeAttribute("type", "text/javascript", null); 
     writer.write("if(typeof " + inputFieldId + "StoredValue != \"undefined\") document.getElementById('" + 
       elementId + "').value = " + inputFieldId + "StoredValue;"); 
     writer.endElement("script"); 
    } 

    @Override 
    protected void doEncodeEnd(ResponseWriter writer, FacesContext context, 
      UIComponent component) throws IOException { 
     writer.endElement("div"); 
    } 
} 
+1

我使用的是richfaces版本3.3.3最終和JSF 1.2 – adevedo 2011-04-14 13:36:52

回答

0

好,我找到了問題,它與facelets.REFRESH_PERIOD,這個屬性如果與正值會使UI樹與原始文檔的每個請求重新構建(調用Facelets的刷新方法)

所以解決方案是禁用該屬性並將其設置爲-1