0

2つのselectOneMenuがあり、最初のメニューの値が変更された場合は2番目の値を変更したいと思います。2つのメニューには、1980年から2012年までの年が含まれています。最初のメニューで1990を選択した場合、2番目のメニューでは1990年から2012年のみを指定します。

しかし、別の値を選択しても何も起こらず、この要素を分析すると次のメッセージが表示されます。

Uncaught TypeError: Cannot read property 'action' of null    
A4J.Query 
A4J.AJAX.PrepareQuery 
A4J.AJAX.Submit 
onchange

これが私が持っているものです:

<%-- Year filter --%>
<h:selectOneMenu id="minYear" value="#{statistics.minYear}" 
                 style="width: 75px">
    <f:selectItems value="#{statistics.minYearValues}" />
    <a4j:support event="onchange" action="#{statistics.minYearChanged}"
                 reRender="maxYear"/>
</h:selectOneMenu>

<h:selectOneMenu id="maxYear" value="#{statistics.maxYear}" 
                 style="width: 75px">
    <f:selectItems  value="#{statistics.maxYearValues}"/>
    <a4j:support event="onchange" action="#{statistics.maxYearChanged}"
                 reRender="minYear" />
</h:selectOneMenu>
<%-- end year filter--%>

そしてここにマネージドBean:

public List getMinYearValues() {
    this.minYear = MIN_YEAR;
    this.minYearValues = fillYearValues(MIN_YEAR, maxYear);
    return minYearValues;
}

public List getMaxYearValues() {
    int min = this.minYear;
    this.maxYearValues = fillYearValues(min, maxYear);
    return maxYearValues;
}

private List fillYearValues(int min, int max) {
    List values = new ArrayList();
    for(int i = min; i <= max; i++) {
        values.add(new SelectItem(i, String.valueOf(i)));
    }
    return values;
}

private int getPresentYear() {
    Calendar cal = Calendar.getInstance();
    cal.setTime(new Date());

    return cal.get(Calendar.YEAR);
}

public void minYearChanged(ValueChangeEvent event) {
    int newValue = new Integer(event.getNewValue().toString());
    this.maxYearValues = fillYearValues(newValue, maxYear);
}

public void maxYearChanged(ValueChangeEvent event) {
    int newValue = new Integer(event.getNewValue().toString());
    this.minYearValues = fillYearValues(minYear, newValue);
}
4

2 に答える 2

1

maxYearChangedBeanの署名とminYearChangedメソッドが、として使用するのが間違っていることを願っていますaction。そのはず public void maxYearChanged();

使用する必要がある場合は、を使用ValueChangeEventする必要がありますvalueChangeListener

JSF 1.2を参照してください:valueChangeListenerイベントが新しく選択された値を返さない

于 2012-06-15T10:06:40.750 に答える
1

最後に解決策を見つけました。これが私がそれをした方法です:

<a4j:region renderRegionOnly="true">

        <%-- Year filter --%>
        <h:selectOneMenu id="minYear" value="#{statistics.minYear}" 
                         style="width: 75px" onchange="this.form.submit()"
                         valueChangeListener="#{statistics.minYearChanged}">
            <f:selectItems value="#{statistics.minYearValues}" />
        </h:selectOneMenu>

        <f:verbatim>&#160;&#160;</f:verbatim>
        <h:outputText value="#{bundleStatistics['Label.minYearToMaxYear']}" />
        <f:verbatim>&#160;&#160;</f:verbatim>

        <h:selectOneMenu id="maxYear" value="#{statistics.maxYear}" 
                         style="width: 75px" onchange="this.form.submit()"
                         valueChangeListener="#{statistics.maxYearChanged}">
            <f:selectItems  value="#{statistics.maxYearValues}"/>
        </h:selectOneMenu>
    <%-- end year filter--%>

</a4j:region>

値変更リスナー:

public void minYearChanged(ValueChangeEvent event) {
    int newValue = new Integer(event.getNewValue().toString());
    this.maxYearValues = fillYearValues(newValue, getPresentYear());
}

public void maxYearChanged(ValueChangeEvent event) {
    int newValue = new Integer(event.getNewValue().toString());
    this.minYearValues = fillYearValues(MIN_YEAR, newValue);
}
于 2012-06-15T14:18:43.763 に答える