jsf - 自定义 h :selectOneRadio with other components 的布局和标签

标签 jsf layout jsf-2 customization selectoneradio

<分区>

我想自定义 <h:selectOneRadio> 的默认布局.

在我的例子中,我需要放一个 <h:selectManyCheckbox>在每个单选按钮之后。这是我目前所拥有的:

<h:selectOneRadio value="#{user.Request}">
    <f:selectItem itemValue="Request1" itemLabel="Request1" />
    <f:selectItem itemValue="Request2" itemLabel="Request2" />
</h:selectOneRadio>

<h:selectManyCheckbox value="#{user.Request1}">
    <f:selectItem itemValue="Certificate1" itemLabel="Certificate1" />
    <f:selectItem itemValue="Certificate2" itemLabel="Certificate2" />
</h:selectManyCheckbox>

<h:selectManyCheckbox value="#{user.Request2}">
    <f:selectItem itemValue="Certificate3" itemLabel="Certificate3" />
    <f:selectItem itemValue="Certificate4" itemLabel="Certificate4" />
</h:selectManyCheckbox>

我试着把它们放在每个选择项之后:

 <h:selectOneRadio value="#{user.Request}">
    <f:selectItem itemValue="Request1" itemLabel="Request1" />
    <h:selectManyCheckbox value="#{user.Request1}">
        <f:selectItem itemValue="Certificate1" itemLabel="Certificate1" />
        <f:selectItem itemValue="Certificate2" itemLabel="Certificate2" />
    </h:selectManyCheckbox>
    <f:selectItem itemValue="Request2" itemLabel="Request2" />
    <h:selectManyCheckbox value="#{user.Request2}">
        <f:selectItem itemValue="Certificate3" itemLabel="Certificate3" />
        <f:selectItem itemValue="Certificate4" itemLabel="Certificate4" />
    </h:selectManyCheckbox>
</h:selectOneRadio>

但是没有用。执行此操作的正确方法是什么?

最佳答案

标准 JSF 不支持此标记 <h:selectOneRadio> .

有一些 JSF 组件库提供了更灵活的组件,例如 Tomahawk <t:selectOneRadio layout="spread"><t:radio> :

<html ... xmlns:t="http://myfaces.apache.org/tomahawk">

<!-- This one won't display anything. -->
<t:selectOneRadio id="request" value="#{user.request}" layout="spread">
    <f:selectItem itemValue="#{1}" itemLabel="Request 1" />
    <f:selectItem itemValue="#{2}" itemLabel="Request 2" />
    <f:ajax render="requests" />
</t:selectOneRadio>

<!-- Just markup them the way you want! -->
<h:panelGroup id="requests" layout="block">
    <ul>
        <li>
            <t:radio for="request" index="0" />
            <h:selectManyCheckbox value="#{user.request1}" disabled="#{user.request != 1}">
                ...
            </h:selectManyCheckbox>
        </li>
        <li>
            <t:radio for="request" index="1" />
            <h:selectManyCheckbox value="#{user.request2}" disabled="#{user.request != 2}">
                ...
            </h:selectManyCheckbox>
        </li>
    </ul>
</h:panelGroup>

PrimeFaces有一个类似的组件, <p:selectOneRadio layout="custom"><p:radioButton> :

<html ... xmlns:p="http://primefaces.org/ui">

<!-- This one won't display anything. -->
<p:selectOneRadio id="request" value="#{user.request}" layout="custom">
    <f:selectItem itemValue="#{1}" itemLabel="Request 1" />
    <f:selectItem itemValue="#{2}" itemLabel="Request 2" />
    <p:ajax update="requests" />
</p:selectOneRadio>

<!-- Just markup them the way you want! -->
<h:panelGroup id="requests" layout="block">
    <ul>
        <li>
            <p:radioButton for="request" itemIndex="0" />
            <h:selectManyCheckbox value="#{user.request1}" disabled="#{user.request != 1}">
                ...
            </h:selectManyCheckbox>
        </li>
        <li>
            <p:radioButton for="request" itemIndex="1" />
            <h:selectManyCheckbox value="#{user.request2}" disabled="#{user.request != 2}">
                ...
            </h:selectManyCheckbox>
        </li>
    </ul>
</h:panelGroup>

无论哪种方式,只要让disabled复选框组的属性检查当前选择的单选按钮值(我已经简单地更改为 Long ,但是 enum 可能更 self 记录),并使用通常的 ajax 魔术来部分更新在更改事件期间查看。

如果出于某种原因无法重用现有 JSF 组件库中的增强组件,那么您需要自己编写所有组件。最简单的是覆盖标准 <h:selectOneRadio>渲染器识别新的 layout属性,然后像上述组件一样相应地生成所需的 HTML 输出。另见 a.o. How to override h:selectOneRadio renderer? Where is the renderer class in jsf-impl?

关于jsf - 自定义 h :selectOneRadio with other components 的布局和标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28569000/

相关文章:

java - Tomcat 7 的 JAAS 身份验证失败,没有错误消息

jsf - 使用带有 p :hotkey and p:commandButton in Primefaces 的处理程序

html - 如何在 HTML 中制作底部固定位置菜单?

java - 服务器重启后出现JSF问题: No saved view state could be found

html - 自动整理 JSP/JSF 文件

html - CSS float 和标记顺序 - 我可以鱼和熊掌兼得吗?

android - 在 RelativeLayout 上设置边距在 Kindle Fire 上不起作用

java - 服务器发起的渲染 : EJB -> FacesContext?

java - 从组件树中读取复合组件属性的字面值

jsf-2 - Ajax 事件永远不会在 <p :inptText> when required ="true" 中触发