Seam / RichFaces + forceId - PullRequest
       32

Seam / RichFaces + forceId

0 голосов
/ 24 января 2011

У меня проблемы с a4j: повтор, и это генерация идентификатора.Каждый элемент внутри цикла имеет свой идентификатор, которому предшествует уникальный идентификатор.Я не хочу этогоЯ хочу, чтобы определенные элементы содержали идентификатор, который я им представляю (я гарантирую, что они уникальны).

Я искал вокруг, и похоже, что у тегов Tomahawk есть атрибут forceId, который заставит элементиспользуйте предоставленный идентификатор.Единственное, похоже, что не рекомендуется использовать теги Tomahawk с Seam / RichFaces.

Есть ли что-нибудь похожее в какой-либо из библиотек тегов, рекомендуемых для использования с Seam?За исключением этого, возможно ли для меня подкласс a4j: repeat (или, возможно, даже ui: repeat) и изменить способ обработки идентификаторов?

Есть идеи?Все, что мне нужно, это способ циклически проходить через элементы, давая им динамические идентификаторы.

Ответы [ 3 ]

1 голос
/ 31 января 2011

Может быть полезно: вы можете получить реальные идентификаторы в JSF (RichFaces) с # {rich: clientId ('id')}.Таким образом, вы можете использовать сгенерированный идентификатор в JS.

1 голос
/ 24 января 2011

Это не проблема RichFaces. Это JSF. JSF добавляет уникальный идентификатор для каждого компонента. Это известная функция JSF.

Однако есть кое-что, что вы можете сделать. В вашем <h:form> вы можете установить prependId="false". Это скажет JSF не добавлять идентификаторы из каждого компонента.

(Также убедитесь, что вы не используете s:decorate="/layout/template.xhtml, потому что template.xhtml и edit.xhtml будут добавлять свои собственные идентификаторы.

Так что сделайте что-то вроде этого:

<h:form prependId="false">
<a4j:repeat value="#{foo}" var="f" rowKeyVar="row">

   <h:inputText id="unique#{row}"/>
</a4j:repeat>
</h:form>

Это сделает идентификатор таким: unique1 unique2 unique3 etc

Обновление

Кажется, ты прав. По какой-то причине тег id не поддерживает этот тип выражения EL.

Я попробовал следующее:

<a:repeat id="table" value="#{foo}" var="k" rowKeyVar="row">
        <h:inputText id="test#{row}" value="row is #{row}" styleClass="test#{row}"/><br/>
</a:repeat>

И он генерирует сгенерированный HTML

<input type="text" class="test0" value="row is 0" name="table:0:test" id="table:0:test">
<input type="text" class="test1" value="row is 1" name="table:1:test" id="table:1:test">
<input type="text" class="test2" value="row is 2" name="table:2:test" id="table:2:test">

Итак, как вы можете видеть, я все еще получаю уникальный идентификатор, потому что. Вероятно, добавление номера для меня автоматически.

Не имеет значения, добавляете вы или нет. Результат тот же.

0 голосов
/ 07 февраля 2012

Я не знаю, почему вы не позволили бы JSF производить генерацию идентификатора для вас, но я понимаю, что это нелегко выяснить, поскольку, по моему мнению, у JSF очень мало документации по этому вопросу.

Я расскажу вам свои выводы по этому вопросу, приведя пример (кстати, используя JSF 2.0.3 Мохарра):

<h:form id="myForm">
    <ui:repeat id="loopzor" var="#{myItem}" value="#{myController.myList}">
        <h:outputLabel for="myName" value="#{labels.name}:" />
        <h:inputText id="myName" value="#{myItem.name}" />
    </ui:repeat>
    <h:selectOneMenu id="type" value="#{address.type.id}">
        <f:selectItems value="#{types}" var="type" itemLabel="#{type.label}" itemValue="#{type.id}"/>
    </h:selectOneMenu>
    <h:inputText id="value" value="#{address.value}"/>
</h:form>

Это типичный пример того, как может выглядеть форма. Вот что происходит, когда страница отображается с размером списка в 2 элемента:

<form id="myForm">
    <label for="myForm-loopzor-0-myName">Name:</label>
    <input id="myForm-loopzor-0-myName" type="text" value="someName" />
    <label for="myForm-loopzor-1-myName">Name:</label>
    <input id="myForm-loopzor-1-myName" type="text" value="someName2" />
    <select id="myForm-type" name="myForm-type>
        <option value="1" selected="selected">Label1</option>
        <option value="2" >Label2</option>
    </select>
</form>

Итак, генерация идентификатора выглядит следующим образом:

  • Дайте идентификаторы всем элементам h: формы, все элементы в этой форме будут иметь префикс с этим идентификатором.
    • Если вы не хотите добавлять префикс ID к каждому элементу, добавьте атрибут prependid = "false" к элементу h: form
  • Дать идентификаторы всем элементам пользовательского интерфейса: repeat (даже если атрибут id не указан в спецификации)
  • Присвойте идентификаторы всем элементам h: inputText и другим элементам ввода, даже внутри элементов ui: repeat, они получат уникальный идентификатор в зависимости от их положения в цикле
  • Вы можете присвоить идентификаторы элементам f: selectItems, но они не будут приняты во внимание
  • Вы можете добавить суффиксы к ID объекта varStatus, но при этом всегда будет возвращаться пустая строка, возможно потому, что при генерации динамических ID объекта varStatus не существует

Надеюсь, это поможет устранить некоторые недоразумения относительно генерации идентификаторов!

...