【问题标题】:Why my calendar is not correctly rendered when I update the month?为什么当我更新月份时我的日历没有正确呈现?
【发布时间】:2016-06-14 19:56:28
【问题描述】:

我想通过下拉列表更改日历的月份。

这是视图的副本:

这里是html代码:

<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:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich">

<h:head>
</h:head>

<h:body>
    <h:form id="TEST">
        <rich:select id="MOIS"
             value="#{essai.mois}"
             valueChangeListener="#{essai.onMois}"
             onclick="document.getElementById('JOUR').showSelectedDate();"
             disabled="false" >
            <f:selectItem itemValue="0" itemLabel="Janvier" />
            <f:selectItem itemValue="1" itemLabel="Février" />
            <f:selectItem itemValue="2" itemLabel="Mars" />
            <f:selectItem itemValue="3" itemLabel="Avril" />
            <f:selectItem itemValue="4" itemLabel="Mai" />
            <f:selectItem itemValue="5" itemLabel="Juin" />
            <f:selectItem itemValue="6" itemLabel="Juillet" />
            <f:selectItem itemValue="7" itemLabel="Août" />
            <f:selectItem itemValue="8" itemLabel="Septembre" />
            <f:selectItem itemValue="9" itemLabel="Octobre" />
            <f:selectItem itemValue="10" itemLabel="Novembre" />
            <f:selectItem itemValue="11" itemLabel="Décembre" />
            <a4j:ajax event="selectitem" render="TEST" />
        </rich:select>
        <br/>
        <rich:calendar
            id="JOUR"
            popup="false"  
            showHeader="false"    
            showFooter="true"
            datePattern="ddMMyyyy"     
            value="#{essai.jour}"
            valuechangelistener="#{essai.onJour}"
            disabled="false">
            <a4j:ajax event="change" render="TEST"/>
        </rich:calendar>
    </h:form>
</h:body>
</html>

这是 bean 代码:

import org.richfaces.demo.calendar.TDate;

@ManagedBean(name = "essai", eager = true)
@SessionScoped
public class EssaiBean implements Serializable {

private static final long serialVersionUID = 1L;

private static final Logger logger = Logger.getLogger(TDate.class.getName());

/** Numéro du jour de la date 1 à 31 ou -1 */
private int             jour;

/** Numéro du mois de la date 0 à 11 ou -1 */
private int             mois;

private Integer         isMonthChanged;


/*********************************************************************************************/
/**                                    getteurs / setteurs                                  **/
/*********************************************************************************************/

public Date getJour() {
    Date date = (new GregorianCalendar(2016, (mois == -1) ? 0 : mois, (jour == -1) ? 1 : jour)).getTime();
    logger.debug("getJour : " + date);
    return(date);
}

public void setJour(Date date) {
    logger.debug("setJour : " + date);
    GregorianCalendar gcDate = new GregorianCalendar();
    gcDate.setTime(date);
    this.jour  = gcDate.get(GregorianCalendar.DAY_OF_MONTH);
    this.mois  = gcDate.get(GregorianCalendar.MONTH);
    isMonthChanged = 0;     
}

public int getMois() {
    logger.debug("getMois : " + mois);
    return mois;
}

public void setMois(int mois) {
    logger.debug("setMois : " + mois);
    this.mois = mois;
    isMonthChanged = 1;     
}

public Integer getMajMois() {
    logger.debug("isMonthChanged : " + isMonthChanged);
    Boolean b = isMonthChanged == 1;
    ;
    return isMonthChanged;
}
/*********************************************************************************************/
/**                                 Gestion des événements                                  **/
/*********************************************************************************************/

public void onJour(ValueChangeEvent event) {
    logger.debug("onJour : " + event.getOldValue() + " => " + event.getNewValue() + " (" + event.getNewValue().getClass().getName() + ")");
}

public void onMois(ValueChangeEvent event) {
    logger.debug("onMois : " + event.getNewValue() + " (" + event.getNewValue().getClass().getName() + ")");
}

/*********************************************************************************************/
/**                                      Autres fonctions                                   **/
/*********************************************************************************************/

/**
 * Cette fonction initialise la date avec la date par défaut '1 JAN 2000'.
 * @param gedcom : date gedcom liée à cette date élémentaire.
 */
public EssaiBean() {
    logger.debug("EssaiBean");
    jour = 1;
    mois = 0;
    isMonthChanged = 0;     
}

}

我的问题是,当我使用下拉列表选择 un 月份时,日历的月份并不总是更新。 如果我在显示表单后立即选择月份,则会更新日历月份。 如果我在日历中选择第一天,然后在下拉列表中选择一个月后,日历月不会更新:

我不明白为什么。

我正在使用 Richfaces 4.5.18 和 wildfly-10.0.0.Final

【问题讨论】:

  • 我们在这里不帮助调试代码。试试stackoverflow。

标签: jsf richfaces


【解决方案1】:

(我不知道你用的是什么射频版本,但不是 4.5.18)

你的问题在这里:

onclick="document.getElementById('JOUR').showSelectedDate();"

当您单击选择时(即在您选择一个月之前)首先会发生 onclick,然后无论如何都会重新呈现表单。

其次,您不能在 DOM 元素上执行组件方法,请使用 RichFaces.component('TEST:JOUR')#{rich:component('JOUR')}。 (也没有 id="JOUR" 的元素)

showSelectedDate() 方法需要在表单重新渲染后发生,因为有 oncomplete 属性:

<a4j:ajax event="selectitem" render="TEST" 
          oncomplete="#{rich:component('JOUR')}.showSelectedDate();" />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 2021-10-20
    • 2021-09-10
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多