2011-01-23 2 views
0

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

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

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

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

ответ

1

Это не проблема 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

Update

Кажется, вы правы. По какой-то причине тег 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

Не работает. Я не думаю, что вы можете указать EL как часть идентификатора (по крайней мере, не внутри повторяющегося элемента). На моей стороне EL либо оценивается как 0, либо вообще ничего, несмотря на то, что в других местах правильное выражение правильно оценивается (например, оно работает в атрибуте title OutputPanel, но не в атрибуте id). Если я смогу заставить это работать, мои проблемы будут решены. – NRaf

+0

Посмотрите мое обновление. Вы можете видеть, что идентификатор уникален. Зачем вам нужен уникальный идентификатор? Это из-за некоторых вещей jQuery/Javascript? Вы также можете всегда использовать класс, как я показал в коде, чтобы получить «уникальный» класс –

+0

Простите, не видел этого до сих пор. Причина, по которой мне нужен уникальный идентификатор, - это возможность обновить определенную строку, используя атрибут reRender RichFaces. – NRaf

1

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

0

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

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

<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> 

Так поколение ID выглядит следующим образом:

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

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

Смежные вопросы