我有两个selectOneMenus,如果第一个菜单中的值已经改变并且向后,则想要更改第二个值。 这两个菜单充满了从1980年到2012年的年份。如果我在第一个菜单中选择1990,我希望在第二个菜单中只有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);
}
答案 0 :(得分:1)
我希望你的bean中maxYearChanged
和minYearChanged
方法的签名错误地用作action
。
它应该是
public void maxYearChanged();
如果您需要使用ValueChangeEvent
,则必须使用valueChangeListener
参考JSF 1.2: valueChangeListener event not returning newly selected value
答案 1 :(得分: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>  </f:verbatim>
<h:outputText value="#{bundleStatistics['Label.minYearToMaxYear']}" />
<f:verbatim>  </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);
}