如何在更改<h:selectonemenu>时设置<p:inputtext>的禁用/只读?</h:selectonemenu> </p:inputtext>

时间:2012-09-15 10:52:04

标签: javascript jsf jsf-2 primefaces

我使用的是<p:dataTable>,我使用了html <table>。我想在<p:inputText>更改事件中禁用/只读PrimeFaces <h:selectOneMenu>

我使用的是JavaScript,但它没有使用它。

<script type="text/javascript">
 function change(val)
 {          
     //alert(val);
     if(val=="Check")
      {

         document.getElementById('bankName').readonly=false;
         document.getElementById('receiptNo').readonly=true;

      }
      if(val=="Cash")
      {

          forms.elements["mainForm:chkNo"].readonly=true;
          document.getElementById('chkNo').readonly=true;
          document.getElementById('bankName').readonly=true;
          document.getElementById('receiptNo').readonly=false;              

      }
}
</script>

JSF代码

<h:column>
                            <p:dataTable id="paymentHistoryDataTable" var="due" 
                                         >

                                <p:column>
                                    .......

                                    <table id="paymentProcess">
                                        <tr>                                                
                                            <td style="width: 80px;">
                                        <h:selectOneMenu value="#{adminActionController.tempBean.selectType}" id="type" onchange="change(this.value);">
                                            <f:selectItem itemLabel="Check" itemValue="Check"/>
                                            <f:selectItem itemLabel="Cash" itemValue="Cash"/>
                                        </h:selectOneMenu>
                                        </td>
                                        </tr>
                                        <tr id="check">
                                            <td></td>
                                            <td></td>
                                            <td style="width: 90px;" id="lblChk">
                                                <label> <h:outputText value="Check/DD Number:" /> </label>
                                            </td>
                                            <td style="width: 90px;">
                                        <h:inputText id="chkNo" value="#{adminActionController.tempBean.checkNumber}"  immediate="true"
                                                     required="false" validatorMessage="insert Check/DD number">
                                        </h:inputText>
                                        </td>

................ 我想在js中访问id =“chkNo”以禁用它..

1 个答案:

答案 0 :(得分:6)

你在这里犯了几个概念错误。

您的具体问题是由于您正在编写基于JSF源代码的JavaScript代码。这不完全正确。 JSF在Web服务器上运行并生成HTML。 JavaScript在webbrowser上运行,只看到HTML,而不是JSF。在webbrowser中右键单击页面,选择查看源并仔细查看。不存在标识为bankNamereceiptNo的任何HTML元素。相反,它是formId:tableId:0:bankNameformId:tableId:1:bankNameformId:tableId:2:bankName等。原则上,您应该使用JavaScript中的那些HTML元素ID来从HTML DOM中选择元素。

但这很笨拙。

而是使用JSF提供的标签/设施来实现所需的功能要求。您可以在readonly中使用JSF表达式语言,例如readonly="#{dropdown.value == 'Cash'}"。您可以使用<f:ajax>执行JSF ajax请求来更新模型和视图。

以下启动示例应该为您提供一个良好的起点:

<h:selectOneMenu id="type" value="#{adminActionController.tempBean.selectType}">
    <f:selectItem itemValue="Check"/>
    <f:selectItem itemValue="Cash"/>
    <f:ajax render="chkNo bankName receiptNo" />
</h:selectOneMenu>
<p:inputText id="chkNo" readonly="#{adminActionController.tempBean.selectType == 'Cash'}" />
<p:inputText id="bankName" readonly="#{adminActionController.tempBean.selectType == 'Cash'}" />
<p:inputText id="receiptNo" readonly="#{adminActionController.tempBean.selectType == 'Check'}" />

当下拉列表发生更改时,<f:ajax>将使用(相对)客户端ID chkNobankNamereceiptNo更新组件。此更新将强制重新评估readonly属性。


对于具体问题,

无关,您使用<p:dataTable><table>的方式,其中您没有将行绑定到var="due"是非常奇怪的,但这是一个可能的主题未来的问题/问题。上面的代码示例假设正确的上下文。