javascript - JSF Primefaces 单选按钮显示/隐藏/启用文本区域

标签 javascript ajax jsf

尝试使用 JSF 和 Primefaces 重构以下 JSP 版本以获得“是/否/不适用/已解决” list :

<c:forEach var="qAndA" items="${checklist.answer_attribute_list}">
 ..trim..
<td class="chklist"><input type="radio" name="radio_<c:out value="${qAndA.attribute_id}" />" onclick="this.form.no_<c:out value="${qAndA.attribute_id}" />.disabled=true;this.form.no_<c:out value="${qAndA.attribute_id}" />.style.backgroundColor='#808080';" value="1"></td>
<td class="chklist"><input type="radio" name="radio_<c:out value="${qAndA.attribute_id}" />" onclick="this.form.no_<c:out value="${qAndA.attribute_id}" />.style.backgroundColor='#ffffff';this.form.no_<c:out value="${qAndA.attribute_id}" />.disabled=false;" value="2"></td>
<td class="chklist"><textarea DISABLED onkeyup="sz(this);" style="background:#808080" name="no_<c:out value="${qAndA.attribute_id}" />" cols=19 rows="4" onkeypress="if(this.value.length>499){ alert('You have exceeded the limit of 500 characters. Please edit your entry.'); return false}"></textarea></td>
<td class="chklist"><input type="radio" name="radio_<c:out value="${qAndA.attribute_id}" />" onclick="this.form.no_<c:out value="${qAndA.attribute_id}" />.disabled=true;this.form.no_<c:out value="${qAndA.attribute_id}" />.style.backgroundColor='#808080';" value="3"></td>
<td class="chklist"><input type="checkbox" DISABLED name="check_<c:out value="${qAndA.attribute_id}" />" value="4"></td>

列标题在图像中被 chop ,但它们是:
问号 |问题 |部分|是的 |没有 |没有理由|不适用 |解决?
Before

使用旧的 JSP,如果用户单击“否”单选按钮,将允许他们在“无原因”下输入文本,但如果他们改变主意,他们仍然可以单击"is"或“不适用” radio 和“无原因”文本框将变灰并禁用。直到用户单击“提交”按钮后,单选值才会真正更改,因此,直到用户单击“否”并提交表单后,“已解决”复选框才会出现。

但是对于 JSF 和数据表,我不知道如何像在旧 Jsp 中那样引用每行中的文本区域。因此,基于 BalusC 的帮助,这篇文章提供了数量类型 list JSF disable inputbox with a checkbox in a ui:repeat on a composite component我使用 Ajax 尝试了以下 JSF:

<p:dataTable id="dataTable" value="#{cc.attrs.checklist.answer_attribute_list}" var="qAndA">

    <p:column headerText="Yes" width="50px;">
        <p:selectOneRadio id="yesNoNA" value="#{qAndA.toggle_value}" layout="custom">
            <f:selectItem itemLabel="Yes" itemValue="1" />
            <f:selectItem itemLabel="No" itemValue="2" />
            <f:selectItem itemLabel="NA" itemValue="3" />
            <f:selectItem itemLabel="Resolved" itemValue="4" />
            <p:ajax update="@form" />
        </p:selectOneRadio>

        <p:radioButton id="yes" for="yesNoNA" itemIndex="0" rendered="#{empty qAndA.toggle_value or qAndA.toggle_value == '0'}" />
        <h:outputText value="X" rendered="#{qAndA.toggle_value == '1'}" />
        <h:outputText value="" rendered="#{qAndA.toggle_value == '2' or qAndA.toggle_value == '3' or qAndA.toggle_value == '4'}" />
    </p:column>


    <p:column headerText="No" width="50px;">
        <p:radioButton id="no" for="yesNoNA" itemIndex="1" rendered="#{empty qAndA.toggle_value or qAndA.toggle_value == '0'}" />
        <h:outputText value="X" rendered="#{qAndA.toggle_value == '2' or qAndA.toggle_value == '4'}" />
        <h:outputText value="" rendered="#{qAndA.toggle_value == '1' or qAndA.toggle_value == '3'}" />
    </p:column>

    <p:column headerText="Reason For Attribute Failure" width="250px;">
        <h:inputTextarea value="#{qAndA.fail_reason}" rendered="#{qAndA.toggle_value == '2'}" />
        <h:outputText value="#{qAndA.fail_reason}" rendered="#{empty qAndA.toggle_value or qAndA.toggle_value == '0'}" />
        <h:outputText value="" rendered="#{qAndA.toggle_value == '1' or qAndA.toggle_value == '3'}" />
        <h:outputText value="#{qAndA.fail_reason}" rendered="#{qAndA.toggle_value == '2' or qAndA.toggle_value == '4'}" />THIS ONE IS REDUNDANT
    </p:column>

    <p:column headerText="N/A" width="50px;">
        <p:radioButton id="na" for="yesNoNA" itemIndex="2" rendered="#{empty qAndA.toggle_value or qAndA.toggle_value == '0'}" />
        <h:outputText value="X" rendered="#{qAndA.toggle_value == '3'}" />
        <h:outputText value="" rendered="#{qAndA.toggle_value == '1' or qAndA.toggle_value == '2' or qAndA.toggle_value == '4'}" />
    </p:column>

    <p:column headerText="Resolved *" width="75px;">
        <p:radioButton id="resolved" for="yesNoNA" itemIndex="3" rendered="#{qAndA.toggle_value == '2'}"
        disabled="#{qAndA.toggle_value != '2'}" />
        <h:outputText value="" rendered="#{qAndA.toggle_value == '1' or qAndA.toggle_value == '3'}" />
        <h:outputText value="X" rendered="#{qAndA.toggle_value == '4'}" />
    </p:column>

enter image description here

Ajax 的问题是它会立即更改值,从而导致表单的行为与 jsp 不同。我不确定如何继续,这对于 Ajax 是否可行。

我也一直在尝试更具体的渲染和更新

 <f:ajax  render=":dataTable:2:texa"/>
 <p:ajax update="how to reference specific row" />

找不到包含从“j_idt19:j_idt48:0:j_idt99:j_idt101:dataTable:2:texa”引用的表达式“:texa”的组件。

j_idt19:j_idt48:0:j_idt99:j_idt101:dataTable:ROWID:COMPONENT

最佳答案

首先,当您打算使用 ajax 更新有条件渲染的组件时,您需要将其包装在另一个始终渲染的组件中,然后使用 ajax 更新它。否则 JS 无法在 HTML DOM 中找到任何内容来替换节点。

<p:column ...>
    <h:panelGroup id="reason">
        <h:inputTextarea ... rendered="#{...}" />
        ...
    </h:panelGroup>
</p:column>

然后,您可以在 <p:ajax update> 中使用与表相关的客户端 ID .

<p:column ...>
    <p:selectOneRadio ...>
        ...
        <p:ajax update="reason" />
    </p:selectOneRadio>
</p:column>

另请参阅:

关于javascript - JSF Primefaces 单选按钮显示/隐藏/启用文本区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32512567/

相关文章:

javascript - 在 react 路由器中的路由之间显示一个简单的加载指示器

php - 尝试使用 jquery ajax 在文本框输入上提交表单不起作用

jsf - JSF 组件 id 中生成的前缀 j_idt33 是什么?

javascript - 使用 onchange 事件处理程序计算平均值

JavaScript 骰子游戏返回 0

javascript - Discord.js 检查 guild 是否有具有特定名称的 channel ,如果有,则将该 channel id 存储到变量中

jquery - 使用 ASP.Net MVC 3/jQuery ajax 传递的列表为空

javascript - 如何以分页形式打印《权力的游戏》Api 中的所有角色名称 | JS 中遍历分页 API

java - 如何从 JSF 页面访问 get First() 和 get Last()?

JSF 渲染弹出窗口出现 manegbean 情况?