【问题标题】:How to set disable/readonly of <p:inputText> on change of <h:selectOneMenu>?如何在 <h:selectOneMenu> 更改时设置 <p:inputText> 的禁用/只读?
【发布时间】:2012-09-15 10:52:03
【问题描述】:

我在其中使用了&lt;p:dataTable&gt;,我使用了html &lt;table&gt;。我想在 &lt;h:selectOneMenu&gt; 更改事件上禁用/只读 PrimeFaces &lt;p:inputText&gt;

我使用了 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" 来禁用它..

【问题讨论】:

  • JavaScript 是区分大小写的,你应该总是使用“readOnly”,使用“readonly”是错误的。
  • 我用过,还是没有禁用
  • 请提供完整的HTML代码,我也不认为使用“forms.elements”是正确的。
  • 如果您对 JSF 1.2 没有任何疑问,请不要使用 [jsf-1.2] 标签。如果您根本不使用 RichFaces 的 &lt;a4j:xxx&gt; 组件,请不要使用 [ajax4jsf] 标签。如果问题与 CSS 无关,请不要使用 [css] 标签。

标签: javascript jsf jsf-2 primefaces


【解决方案1】:

您在这里犯了几个概念上的错误。

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

但这很笨拙。

而是使用 JSF 提供的标签/工具来实现所需的功能需求。您可以在readonly 中使用JSF 表达式语言,例如readonly="#{dropdown.value == 'Cash'}"。您可以使用&lt;f:ajax&gt; 执行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'}" />

当下拉列表更改时,&lt;f:ajax&gt; 将更新具有(相对)客户端 ID chkNobankNamereceiptNo 的组件。此更新将强制重新评估 readonly 属性。


与具体问题无关,您使用&lt;p:dataTable&gt;&lt;table&gt; 的方式(其中您没有将行绑定到var="due")非常奇怪,但这是未来可能出现的问题/问题的主题.上面的代码示例假定了正确的上下文。

【讨论】:

  • thnx,我正在尝试将 selectOneMenu 值分配给 adminActionController.tempBean.selectType 但它没有分配给它。我从 request.getParameterMap();
  • 这很可能是由你奇怪的 &lt;p:dataTable&gt;&lt;table&gt; 构造引起的,其中输入值根本没有绑定到 var="due" (实际上成为 last 的值每次都记录)。
猜你喜欢
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 2010-12-05
  • 1970-01-01
  • 2013-11-09
  • 2020-11-29
  • 2015-06-11
相关资源
最近更新 更多