2012-08-28 47 views
0

如何级联列表,以便如果用户更改了selectedCategory列表中的选择,它应更新selectedTo列表。jsf级联列表

这里是我的代码片段:

<h:selectOneMenu id="selectedCategory" value="#{converterBean.selectedCategory}"> 
    <f:ajax execute="selectedCategory" render="selectedFrom"/> 
    <f:selectItems value="#{converterBean.categories}"/> 
</h:selectOneMenu> 
<h:selectOneListbox id="selectedFrom" value="#{converterBean.selectedFrom}" size="5"> 
    <f:selectItems value="#{converterBean.fromList}"/> 
    <f:ajax execute="selectedCategory selectedFrom" render="selectedTo"/> 
</h:selectOneListbox> 
<h:selectOneListbox id="selectedTo" value="#{converterBean.selectedTo}" size="5"> 
    <f:selectItems value="#{converterBean.toList}"/> 
</h:selectOneListbox> 

我注意到,它的更新列表地选自但不会进一步级联到selectTo列表。

按照建议尽量使两者地选自和selectedTo的类别选择从页面张贴的要求是:

POST http://localhost:8081/converter_web/faces/converter.xhtml HTTP/1.1 
Accept: */* 
Faces-Request: partial/ajax 
Content-Type: application/x-www-form-urlencoded;charset=UTF-8 
Referer: http://localhost:8081/converter_web/ 
Accept-Language: en-us 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) 
Host: localhost:8081 
Content-Length: 1253 
Connection: Keep-Alive 
Pragma: no-cache 
Cookie: JSESSIONID=DDDEA598A60CC468763C36B536513B41 

converter_form=converter_form&converter_form%3AselectedCategory=temperature&converter_form%3AselectedFrom=mm&converter_form%3AselectedTo=cm&converter_form%3Avalue=0.0&javax.faces.ViewState=b%2BArKl5NJujWibUQzHf3dUG2JlT%2Bnq7KygA2%2FXpXXscCouBr5xT9Br%2BmoP78%2FvuPAYG%2Bi7Q0jFEKGqJpFgRo%2BDU4ZV251yac84pu3bZ71V9j%2BHvRPMkWw82S8q0v2p1jmn3msPXxvKrQQ1oVpr7pGBPXc2faQGXHW55Md%2BKSkspIgCxXx3x3T6NDaJ1%2BGTEFkyb1DE%2BdoQHQ4EjqV3jEC5mq56OlsHgEmkQ8TVCQM%2FPmAfUBWiQEHqBYzohXNfFpO3kfdrKjeTrq648UtGPYU88VJ9mtIOptYEfwFKN9y%2FG9MOBKEfRZ9XlJz2bPt1zmATIg3iRT1W7YVtmHq7e9g%2FUxsM82duMxFUWhoFPHfrFk4tt48LFH29Hk60y3eeFxqtg7g1JxPD1aQrLN9sxBduS53nFWObCms1YU40uvMT2yjX0kp4wM8YwqT2jTFDtLHcVBide1RGTnzFGzjOrbCJ8rIEmWfPa1yUMkXRBBsgpKWFIl0ueBQiCT%2BDoD9UXlNOQGS%2F5tIdP%2BVTO%2FkWiBo5X99SpKwKY8%2B2pqzJKDrPRXIwci52Wi%2Fo%2Fw%2B0TkpnVrtDaDl7w2eYjmq7bYZFRDjWy3Jtgc5V1DUF%2BhX3Bfiq7l%2Fq5YL4DYx0NBI2esfJ0LTFCqXu8aCk%2BWOPOWnOCSGA5Y9EGUXgzV6q%2Fp%2FFWa8Kj8E%2FeoB380eFwXAEiyyRGv&javax.faces.source=converter_form%3AselectedCategory&javax.faces.partial.event=change&javax.faces.partial.execute=converter_form%3AselectedCategory&javax.faces.partial.render=converter_form%3AselectedFrom%20converter_form%3AselectedTo&javax.faces.behavior.event=valueChange&javax.faces.partial.ajax=true 

我们希望只selectedCategory被发送,但它在发送Ajax调用所有表单域。它虽然调用getCategories(),getFromList(),getToList(),但当它调用getToList时,它使用category = temperature和from = mm。 from = mm是POST请求中传递的参数selectedFrom = mm。

Regards,

Miten。

回答

0

我添加了Ajax监听器的下方,表明该类别的变化被调用,这样getFromList将设置地选自新项目从其列表中,而不是一个被张贴。然后getToList将找到正确的类别并从单元中查询其列表。

<f:ajax execute="selectedCategory" render="selectedFrom"></f:ajax> 

<f:ajax listener="#{converterBean.categoryChanged}" execute="selectedCategory" render="selectedFrom selectedTo"></f:ajax> 
1

更改此:

<f:ajax execute="selectedCategory" render="selectedFrom"/> 

要这样:

<f:ajax execute="selectedCategory" render="selectedFrom selectedTo"/> 
+0

Baydogan我已经尝试过了,导致只有一个当前类别老地选自请求予以公布。我们想要的是使用selectedCategory填充selectedFrom列表,然后使用selectedCategory和新的selectedFrom查询selectedTo。 – Miten

+0

我不确定我是否了解您的具体功能要求,但是这不仅仅是将'selectedFrom'添加到'execute'的问题?我也很惊讶地发现应该负责填充下拉列表的ajax监听器丢失了,这表明你在getter方法中做了商业工作,这在JSF中被认为是一件坏事。 – BalusC

+0

@BalusC据我了解,添加要执行的字段仅仅意味着我们希望他们发布请求。所以当我提交类别时,我只发布selectedCategory,而当我从单元提交时,我传递了selectedCategory和selectedFrom。当类别改变时,来自单位需要刷新。当单位选择更改为单位需要刷新时。给出类似的国家 - >州 - >城市级联。据我所知,渲染方法是我们可以在服务层调用业务逻辑的地方。 – Miten