0

我有一个使用 ajax 更新 selectOneList 的 selectOneRadio:

<h:outputLabel for="categ" value="Category" />
<h:selectOneRadio id="categ" value="#{cdManager.store.cd.categ}" required="true">
    <f:selectItems value="#{cdManager.store.cd.categs}"/>                    
    <f:ajax execute="categ" render="subcategs" listener="#{cdManager.categChanged}" />
</h:selectOneRadio>                                

<h:outputLabel for="subcategs" value="Sub-categ"/>
<h:selectOneListbox id="subcategs" value="#{cdManager.store.cd.subcateg}"     required="true">
    <f:selectItems value="#{cdManager.subcategsArray}"/>                    
</h:selectOneListbox>

当页面出现时,我的会话 bean 创建一个新的(空的)CD 对象。当用户填写所有信息并提交时,(现在已填写)CD 对象被保存,工作正常。

问题是当用户更改收音机(没有提交)时正在设置“类别”属性,这很糟糕,因为用户可以单击“后退浏览器”,当他们回来时,收音机将被选中,而另一个字段将是空的,非常糟糕的行为!

我怎样才能解决这个问题并仍然使用 ajax?

这是监听器代码:

public void categChanged()
{        
    //store.cd.categ is alredy set ? WHYYY ?
    String categ = store.getCd().getCateg();    
    this.subcategsArray = store.getCd().getSubcateg(categ);                                                 
}

我正在使用 JSF 2.0、NetBeans IDE 7.0.1 和 Glassfish 3.1,任何帮助都会很棒,谢谢!

4

1 回答 1

1

问题是当用户更改收音机(不提交)时正在设置“类别”属性

这就是ajax的重点。

如果您使用浏览器的后退按钮,您将看到来自浏览器缓存的页面。您可以禁用页面缓存。然后,您将使用新的支持 bean(如果它是请求或视图范围)从服务器获取一个新页面,或者检查您的categChanged()方法中是否存在其他字段。

于 2012-04-12T05:55:31.073 回答