我的支持bean是Request Scoped的页面上有两个下拉列表。首次呈现页面时,始终禁用第二个下拉列表。但是,如果用户将第一个下拉列表切换为与默认值不同的值,则启用第二个下拉列表。当用户提交表单时,我希望我的RequestScoped托管bean看到第二个下拉列表的值。但是,显然,由于第二次下拉最初被禁用,其值不会随表单一起提交,即使提交表单时,也会启用下拉列表。
我解决这个问题的方法是将第二个下拉列表的禁用“状态”存储在ViewScoped bean中。这样,当用户将第一个下拉列表更改为默认值以外的值时,actionListener可以触发,它将更新与第二个下拉列表关联的ViewScoped bean的值(将其状态更改为未禁用)。
这是处理这种情况的最佳方法吗?或者,还有更好的方法?
答案 0 :(得分:2)
这确实是最理智的方法。
另一种方法是,如果确实需要将bean放在请求范围内,则需要重新确定(post)构造函数中第二个下拉列表的disabled
状态。 bean基于您在request parameter map中可以找到的第一个下拉列表的提交值(或者让JSF通过@ManagedProperty
设置它)。如有必要,您只需手动重复JSF转换/验证。
假设当第一个下拉列表的提交值等于字符串值foo
并且第一个下拉列表的客户端ID为form:dropdown1
时,不应再禁用第二个下拉列表:
public Bean() {
this.dropdown2disabled = !"foo".equals(FacesContext.getCurrentInstance()
.getExternalContext().getRequestParameterMap().get("form:dropdown1"));
}
但是当你发现时,视图范围的bean更容易。
作为另一种替代方法,您可以使用Tomahawk's <t:saveState>
直接在视图状态中存储单个属性。然后将其添加到视图中:
<t:saveState value="#{bean.dropdown2disabled}" />
与使用视图范围的bean相比,这将导致视图状态的小小。
答案 1 :(得分:0)
我有类似的问题。我最终使用“假”禁用来解决它。
<div style="position:relative">
<p:inputText styleClass="ui-state-disabled">
<!-- fake-disable input field -->
<div style="position:absolute; top:0; left:0; width:100%; height:100%;"/>
</div>
在输入上方使用不可见的div,用户无法与其进行交互。另外,我设置了输入字段的样式,使其看起来已禁用。