Как отобразить что-то рядом с элементом h: selectOneRadio?

У меня есть список элементов, который генерирует мои <h:selectOneRadio> элементы:

<h:selectOneRadio id="list#{cand.id}" value="#{mybean.value}" layout="pageDirection">
    <c:forEach items="#{mybean.list}" var="c">
        <f:selectItem id="first#{c.id}" itemlabel="#{c.surname}" itemValue="#{c.name}" />
    </c:forEach>
</h:selectOneRadio>

Я хочу, чтобы рядом с каждым элементом отображалось <h:outputText> со значением #{c.id}, так что в каждой строке будет мой элемент radioButton, а рядом с ним какое-то текстовое поле. Как мне это сделать ?

Я пробовал что-то вроде этого:

<h:selectOneRadio id="candidates1#{cand.id}" value="#{candidates.selectedCandidate1}" layout="pageDirection">
    <c:forEach items="#{candidates.c1}" var="cand">
        <td>
            <f:selectItem id="first#{cand.id}" itemlabel="#{cand.surname}" itemValue="#{cand.name}">
                <h:outputText id="c1ShortName#{cand.id}" value="#{cand.id}" />
            </f:selectItem>
        </td>
        <td>
            <h:outputText id="c1ShortName#{cand.id}" value="#{cand.id}" />
        </td>
    </c:forEach>
</h:selectOneRadio>

Но он отображает все радиокнопки после последнего outputText.

Я хочу что-то вроде скриншота ниже. Когда правая часть представляет собой, например, идентификаторы, ее можно зашифровать и расшифровать.

введите здесь описание изображения


person Aram Gevorgyan    schedule 25.01.2013    source источник


Ответы (1)


Просто поместите его на этикетку товара.

itemlabel="#{c.id} #{c.surname}"

Или наоборот, вы не разобрались в этом.

itemlabel="#{c.surname} #{c.id}"

При необходимости вы можете использовать HTML таким образом, вам следует только остерегаться дыра для атаки XSS в фамилии.

itemlabel="#{c.surname} &lt;strong&gt;#{c.id}&lt;strong&gt;" itemEscaped="false"

Или, если вы действительно хотите, чтобы они находились вне сгенерированного <label>, используйте стороннюю библиотеку компонентов. Это именно не поддерживается <h:selectOneRadio>. Например, у Tomahawk <t:selectOneRadio> для этого есть атрибут layout="spread".

Смотрите также:


Не связанный с конкретной проблемой, вам не нужен этот <c:forEach>. Это просто неуклюже. Просто используйте <f:selectItems var>. Это новое со времен JSF 2.0, возможно, вы слишком много внимания уделяли древним целевым ресурсам JSF 1.x.

<h:selectOneRadio ...>
    <f:selectItems value="#{mybean.list}" var="c" 
        itemlabel="#{c.id} #{c.surname}" itemValue="#{c.name}" />
</h:selectOneRadio>

Смотрите также:

person BalusC    schedule 25.01.2013
comment
Нет, проблема в том, что я хочу, чтобы они были отдельными. Мне нужно, чтобы они были в разных элементах управления. - person Aram Gevorgyan; 26.01.2013
comment
Это невозможно с <h:selectOneRadio>. Я обновил ответ. В будущих вопросах уточните, чего вы хотите достичь в окончательной HTML-разметке, например. предоставив пример желаемого вывода HTML. - person BalusC; 26.01.2013
comment
Так это невозможно сделать с MyFaces? - person Aram Gevorgyan; 26.01.2013
comment
Нет, это невозможно. Компоненты UISelect принимают только UISelectItem(s) потомков. Просто используйте itemlabel="#{c.surname} #{c.id}". Я не понимаю, почему вам нужно иметь его в отдельном <span>. Это для стайлинга? Если да, то какое конкретное функциональное требование требует от вас использования этой странной конструкции? В любом случае вы всегда можете использовать HTML в метке элемента, если установите itemEscaped="false". - person BalusC; 26.01.2013
comment
Мой текущий ответ остается в силе. <t:selectOneRadio>, вероятно, ваш лучший выбор. - person BalusC; 26.01.2013
comment
Спасибо, понял, просто отвечу вам, почему я хочу, чтобы они были в отдельном ‹пролёте›. - person Aram Gevorgyan; 26.01.2013