如何在JSF中禁用多个h:inputtext字段

时间:2013-01-24 06:25:06

标签: jsf

在我的主页(.xhtml)中,我在JSF页面中有4小时:inputText框和一个serach按钮(h:commandButton)

<h:inputText id="stlID"    value="#{searchSettlementTransRequest.stlmtTransId}" name='stlmt'> 
<h:inputText id="pmtID"    value="#{searchSettlementTransRequest.pmtTransId}"   name='pmt'>
<h:inputText id="AgentID"  value="#{searchSettlementTransRequest.AgentId}"      name='agnt'>
<h:inputText id="AgencyID" value="#{searchSettlementTransRequest.AgencyId}"     name='agncy'>

<h:commandButton id="tranSearchBtn" styleClass="valign first button-search sSearch" action="stlmtSubmit"/>

我的要求是:

  1. 在第一个输入字段中输入数据时,应禁用其他输入字段(即2,3,4)。
  2. 在第二个输入字段中输入的数据时,应禁用其他输入字段(即1,3,4)。等等.. 注意:同时如果用户在第1或第2或第3或第4(用户动态)字段中输入数据并在删除输入字段之前删除相同的数据,则应启用所有字段。 当我在点击“搜索”按钮后得到响应(空或非空数据响应)时,现在应该启用所有输入字段以进行另一次搜索(现在用户可以在4个字段中的任何一个中输入数据)

2 个答案:

答案 0 :(得分:1)

如果你只想在jsf中这样做,只需要添加一些AJAX调用。以下一些建议:

添加到<h:inputText属性disabled,其值为#{searchSettlementTransRequest.getDisabled('this_component_id')"。所以整件事情看起来像这样:

<h:inputText id="someId1" value="#{searchSettlementTransRequest.someValue}" name="stlmt" disabled="#{searchSettlementTransRequest.getDisabled('someId1')}"/>

接下来在你的bean处理这个请求改变了'stlmTransId,pmtTransId,AgentId,AgencyId'的解决方案,他们将标记这个值被设置:

public void setXXX(XXX xxx) {

  // your actual code comes here and at the end set that this component was changed
  actuallyChanged = id_of_input_text_component_corresponding_to_this_value_as_string;

}

当然,您必须向您的bean添加字段String actuallyChanged。 方法getDisabled(String compId)会知道外观:

public String getDisabled(String compId) {
  if (actuallyChanged.equals(compId)) {
    return "";
  else {
    return "disabled";
  }
}

对于所有组件,您还可以添加如下的AJAX调用:

<f:ajax event="change" execute="@this" render="stlID pmtID AgentID AgencyID"/>

因此,知道一个组件的值何时会改变所有其他组件将被禁用。但是在调用make之后启用它们是不可能的,因为如果没有cliend side脚本,你就不能轻易地将它们提供给select或focus获得或任何东西。

如果你想暂时禁用组件,例如当用户键入一个组件时,其他所有组件都被禁用,但是当他选择其中一些组件时,则会启用所选的一个组件,而其他所有组件,包括首先写入文本的组件,将包括被禁用。在这种情况下,更好的方法是使用客户端脚本,例如JavaScript。

更新以完全匹配您在JavaScript(jQuery)中的问题

向所有组件添加如下事件:

onkeyup="$('#thisComponentId').attr('disabled', false); $('#otherComponentId').attr('disabled', true); $('#otherComponentId').attr('disabled', true); " 

发表评论后,您可以将其更改为:

onkeyup="if ($('#thisComponentId').val() && $('#thisComponentId').val() == '') { // here set enable for all components } else { // here set disable for all other components }

这不是很复杂的方法,但应该有效。知道当你开始输入一个组件时,其他组件将被禁用,但是当你发送请求时,将再次启用所有组件。

我希望我的解释有用

答案 1 :(得分:1)

如果希望在每次加载页面后启用输入,则可以使用表示页面加载的标志,并在通过侦听器发出每个ajax请求后将该标志设置为false。并确保在完成页面加载后将标志设置为true,您可以使用preRenderView事件。您只需要为preRenderView事件执行一个方法,如果通过完整请求而不是ajax请求加载页面,则将该标志设置为true。如果页面加载了ajax请求,faces-request参数将设置为“partial / ajax”。

public static final String INITIAL_VALUE = ""; // I assume your fields are integer and they are initialized to INITIAL_VALUE in the first place    

public Boolean pageIsLoadedWithFullRequest = true;

public void preRenderView()
{
   //check whether the request is an ajax request or not  

Map<String, String> requestHeaderMap = FacesContext.getCurrentInstance().getExternalContext().getRequestHeaderMap();
if(!"partial/ajax".equals(requestHeaderMap.get("faces-request")))
{
    pageIsLoadedWithFullRequest = true;
} 

如果您想在用户写入其中一个字段时禁用其他输入,您可以在模糊事件之后进行ajax调用以更改其他输入字段的状态并将pageIsLoadedWithFullRequest标志设置为false在听众中。

public void madeAjaxRequest()
{
     pageIsLoadedWithFullRequest = false;
}

public Boolean getStlIDEnabled()
{
return pageIsLoadedWithFullRequest || !stlmtTransId.equals(INITIAL_VALUE) && pmtTransId.equals(INITIAL_VALUE) && AgentId.equals(INITIAL_VALUE) && AgencyId.equals(INITIAL_VALUE);
}

public Boolean getPmtTransIdEnabled()
{
return pageIsLoadedWithFullRequest || stlmtTransId.equals(INITIAL_VALUE) && !pmtTransId.equals(INITIAL_VALUE) && AgentId.equals(INITIAL_VALUE) && AgencyId.equals(INITIAL_VALUE);
}

public Boolean getAgentIdEnabled()
{
return pageIsLoadedWithFullRequest || stlmtTransId.equals(INITIAL_VALUE) && pmtTransId.equals(INITIAL_VALUE) && !AgentId.equals(INITIAL_VALUE) && AgencyId.equals(INITIAL_VALUE);
}

public Boolean getAgencyIdEnabled()
{
return pageIsLoadedWithFullRequest || stlmtTransId.equals(INITIAL_VALUE) && pmtTransId.equals(INITIAL_VALUE) && AgentId.equals(INITIAL_VALUE) && !AgencyId.equals(INITIAL_VALUE);
}


<f:event type="preRenderView" listener="#{searchSettlementTransRequest.preRenderView()}"/> <!--This will ensure that preRenderView method will be called right before rendering of the view ends -->
<h:inputText  id="stlID"  value="#{searchSettlementTransRequest.stlmtTransId}" name='stlmt' disabled="#{not searchSettlementTransRequest.stlIDEnabled}"/> 
<h:inputText  id="pmtID"  value="#{searchSettlementTransRequest.pmtTransId}" name='pmt' disabled="#{not searchSettlementTransRequest.pmtTransIdEnabled}"/>
<h:inputText  id="AgentID"  value="#{searchSettlementTransRequest.AgentId}" name='agnt' disabled="#{not searchSettlementTransRequest.AgentIdEnabled}"/>
<h:inputText  id="AgencyID"  value="#{searchSettlementTransRequest.AgencyId}" name='agncy' disabled="#{not searchSettlementTransRequest.AgencyIdEnabled}"/>

如果你想通过ajax禁用它们,你应该添加f:ajax命令并渲染所有这四个inputTexts。例如:

<h:inputText  id="stlID"  value="#{searchSettlementTransRequest.stlmtTransId}" name='stlmt' disabled="#{not searchSettlementTransRequest.stlIDEnabled}"> 
<f:ajax event="blur" 
 listener=#{searchSettlementTransRequest.madeAjaxRequest()}
 execute="stlID pmtID AgentID AgencyID"
 execute="stlID pmtID AgentID AgencyID"/>
</h:inputText>

不相关将大小写变量的第一个字母(例如AgentId,AgencyID)放在一起并不是一个好习惯,如果将它们更改为agentId和agencyID,应该会更好。

干杯