Шов условного рендера без разбора - PullRequest
2 голосов
/ 18 августа 2011

Я пытаюсь сделать условный рендер в моем приложении Seam (2.2.0), чтобы отобразить два разных элемента управления в зависимости от условия.

Я использую тег s:fragment с рендероматрибут, но моя проблема в том, что я хочу, чтобы любой элемент управления отображался с одинаковым идентификатором:

<s:fragment render="${editable}">
  <rich:calendar id="entityDate"..../>
</s:fragment>
<s:fragment render="${!editable}">
  <h:outputText id="entityDate".../>
</s:fragment>

Моя проблема заключается в том, что даже если для атрибута рендеринга задано значение false, «не будет отображаться»элемент анализируется, и я получаю исключение из-за дублированного идентификатора.

Я также пытался с тегом <ui:remove>, который эффективно удаляет элемент до фазы синтаксического анализа, поэтому я могу получить что-то вроде:

<span id="myId"/>
<ui:remove>
  <span id="myId"/>
</ui:remove>

К сожалению, тег <ui:remove> не поддерживает условную логику.Кто-нибудь нашел способ решить эту проблему?

Ответы [ 4 ]

3 голосов
/ 18 августа 2011

Это возможно только при использовании тега времени построения представления, такого как JSTL <c:if>.

<c:if test="#{editable}">
    <rich:calendar id="entityDate" />
</c:if>
<c:if test="#{!editable}">
    <h:outputText id="entityDate" />
</c:if>

(обратите внимание, что это не будет работать внутри JSF-компонента iterablte, такого как <ui:repeat>, <h:dataTable> и т. Д.)

В конце концов, я настоятельно рекомендую вместо этого воспользоваться атрибутом disabled, при необходимости с хорошим снимком CSS, чтобы скрыть границы поля ввода и так далее. Это сведет к минимуму исходный код JSF.

<rich:calendar id="entityDate" disabled="#{!editable}" />

Отключенные входные данные могут отдельно настраиваться с помощью селектора атрибутов CSS element[attribute], например,

input[disabled] {
    border: 0;
}

Приведенное выше удаление границы элементов input с присутствующим атрибутом disabled делает его похожим на обычный выводимый текст.

0 голосов
/ 03 сентября 2011

Сможете ли вы получить те же результаты, которые вам нужны, поместив тег id на фрагмент? Итак:

<s:fragment id="entityDate">
  <rich:calendar render="${editable}" />
  <h:outputText render="${!editable}" />
</s:fragment>
0 голосов
/ 29 августа 2011

Я использую себе selenuim в среде шва, и я рекомендую использовать определенные идентификаторы всякий раз, когда это возможно. Во-первых, у вас есть возможность создавать меньшие идентификаторы, которые полезны для размера страницы. Второй тест на селен выполняется намного быстрее, если вы используете идентификаторы для ссылок вместо других селекторов. Я еще не нашел тест селена, где вы не можете обрабатывать разные идентификаторы. Кроме того, если при создании дерева jsf происходит сбой кода, вы видите, какой идентификатор не работает.

Я вижу, вы используете sfragment с возможностью редактирования или нет. Я использую sdecorate и даю id decorate, а затем, например, «только что» для ввода и vi для выходного текста. Это позволяет легко в Селене проверять доступность редактирования или просмотра компонентов.

0 голосов
/ 18 августа 2011

"Решить"? Здесь нечего решать: два элемента в графическом интерфейсе не могут иметь одинаковый идентификатор. Вряд ли неестественно или несостоятельно?

Это все равно что спросить: «У меня есть таблица базы данных с двумя строками, я хотел бы, чтобы у них обоих было одно и то же значение первичного ключа, но каким-то образом я получаю эти ошибки ... Кто-нибудь сумел решить проблему и обойти ограничения ?».

Или даже более близкая аналогия: "У меня есть два пролета, один из них невидим (имеет стиль =" display: none "). Я бы хотел, чтобы у них обоих был один и тот же идентификатор - и браузерам это не нравилось, несмотря на один пролеты невидимы ".

Нижняя строка: отображается без отображения, каждый компонент по-прежнему является частью дерева представления и, следовательно, имеет уникальный идентификатор.

У меня есть подозрение, что вы хотите иметь какой-то "полиморфный" код, который должен работать с видимым в данный момент элементом. Использование идентификатора для такого кода НЕПРАВИЛЬНО. Если вы покажете нам свой вариант использования, мы могли бы найти правильный способ достижения эффекта.

...