2012-04-12 42 views
0

我有一个更新selectOneList,使用Ajax将selectOneRadio:JSF AJAX更新行为

<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对象被保存,工作正常。

的问题是,当用户改变无线电(withou提交) ,这是不好的,因为用户可以点击“回浏览器”,当他们回来,电台将在“CATEG”属性被设置被选中,其他字段将被清空,非常不好的行为!

我该如何解决这个问题,仍然使用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,任何帮助将是巨大的,谢谢!

+0

更改您的bean以查看范围而不是会话 – 2012-04-12 13:58:36

回答

1

的问题是,当用户 改变无线电(不提交)的“CATEG”属性被设置

即AJAX的点。

如果您使用浏览器的后退按钮,您将看到浏览器缓存中的页面。你可以disable caching of your page。然后你会从服务器上得到一个新的页面,并带有一个新的支持bean(如果它是请求或视图范围),或者检查categChanged()方法中是否存在其他字段。

+0

我已经尝试禁用缓存,但它是一个会话bean。我也需要ajax,因为这个列表可能会增长。我想要的只是与表单“同步”bean。换句话说,如果用户填写表单并重新加载页面,则应该显示一个空白表单。 – Fernando 2012-04-12 06:05:42

+0

是否真的有必要在会话范围中使用bean?您的要求反而提示了其中一个较窄的范围。 – 2012-04-12 06:15:39

+0

我需要会话范围。必须有一种做这种同步的方法.. – Fernando 2012-04-12 06:18:41