2015-11-25 3 views
1

У меня странная ситуация с композитным компонентом. Я использую его во всем своем веб-приложении, но теперь я заметил, что если я обновляю форму, содержащую мой составной компонент, компонент get обрабатывается дважды (время от времени).Композитный компонент отображается дважды после вызова ajax

Мой компонент (скажем, это называется datecc) определяется следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
<!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:composite="http://java.sun.com/jsf/composite" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui"> 
    <h:body> 
     <composite:interface> 
      <composite:attribute name="value"/> 
      <composite:attribute name="shortFormat"/> 
      <composite:attribute name="style"/> 
      <composite:attribute name="styleClass"/> 
      <composite:attribute default="false" name="inputLabel"/> 
     </composite:interface> 
     <composite:implementation> 
      <span id="#{cc.clientId}"> 
       <h:outputText rendered="#{not cc.attrs.inputLabel}" style="#{cc.attrs.style}" styleClass="#{cc.attrs.styleClass}" value="#{cc.attrs.value}"> 
        <f:convertDateTime pattern="#{cc.attrs.shortFormat ? 'dd/MM/yy' : 'dd/MM/yyyy'}" timeZone="#{timezone}"/> 
       </h:outputText> 
       <span>asdasdfasdf</span> 
       <h:inputText disabled="true" rendered="#{cc.attrs.inputLabel}" style="#{cc.attrs.style}" styleClass="#{cc.attrs.styleClass}" value="#{cc.attrs.value}"> 
        <f:convertDateTime pattern="#{cc.attrs.shortFormat ? 'dd/MM/yy' : 'dd/MM/yyyy'}" timeZone="#{timezone}"/> 
       </h:inputText> 
      </span> 
     </composite:implementation> 
    </h:body> 
</html> 

страница Я звоню его из что-то похожее на это:

<h:form id="form"> 
    <p:dataTable id="rowsTable" value="#{myBean.rows}" var="it" 
      selectionMode="single" selection="#{myBean.selectedRow}" rowKey="#{it.key}" 
      rowStyleClass="#{myBean.isRed(it) ? 'red' : null}"> 
     <p:ajax event="rowSelect" update=":menuForm :detailForm :contextualMenu"/> 
     <column>....</column> 
     <column><mycc:datecc value="#{it.date}" inputLabel="true" /></column> 
    </p:dataTable> 
</h:form> 

<h:form id="detailForm> 
    <!-- this field is rendered twice once I select a row in the above table --> 
    <mycc:datecc value="#{myBean.selectedRow.date}" inputLabel="true" /> 
</h:form> 

Я к сожалению выполняя некоторую работу над методом setSelectedRow в моем компоненте @Named @ConversationScoped public class MyBean { ... }, однако я не думаю, что это вызывает проблему.

+0

какая у вас версия jsf - https://java.net/jira/browse/JAVASERVERFACES-2977? если он меньше Mojarra 2.2.5, вы можете перейти на новую версию, пожалуйста? –

+0

Я развертываю приложение на Glassfish3 с Mojarra 2.1.29-03 –

+0

@MahendranAyyarsamyKandiar Я обновил JSF сейчас у меня есть Mojarra 2.2.9, но проблема все еще присутствует. Любая помощь? –

ответ

1

Я решил проблему, выполнив следующий класс.

package com.company.faces.cc; 

import javax.faces.component.FacesComponent; 
import javax.faces.component.NamingContainer; 
import javax.faces.component.UIInput; 
import javax.faces.component.UINamingContainer; 

@FacesComponent("inputDate") 
public class Date extends UIInput implements NamingContainer { 
    @Override 
    public String getFamily() { 
     return UINamingContainer.COMPONENT_FAMILY; 
    } 
} 

Хотя я действительно не знаю, почему это решает проблему, поскольку она не добавляет много компонентов.