首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Seam / RichFaces + forceId

Seam / RichFaces + forceId
EN

Stack Overflow用户
提问于 2011-01-24 05:52:06
回答 3查看 2.2K关注 0票数 0

我在使用a4j时遇到了问题:重复一遍,这是id生成。循环中的每个元素的id前面都有一个唯一的标识符。我不想这样。我希望某些元素包含我呈现给它们的id (我确保它们是唯一的)。

我已经搜索过了,看起来Tomahawk标签有一个属性forceId,它将使元素使用所提供的id。唯一的问题是,看起来不推荐在Seam / RichFaces中使用Tomahawk标签。

在推荐与Seam一起使用的标签库中有没有类似的东西?除此之外,我将a4j:repeat子类化(甚至ui:repeat)并改变它处理id生成的方式是否合理?

有什么想法吗?我所需要的是一种遍历元素的方法,为它们提供动态ids。

EN

回答 3

Stack Overflow用户

发布于 2011-01-24 16:46:38

这不是RichFaces问题。它就是JSF。JSF为每个组件添加了一个唯一的id。这是一个已知的JSF特性。

但是,您可以做一些事情。在您的<h:form>中,您可以设置prependId="false"。这将告诉JSF不要从每个组件添加任何ID。

(还要确保您没有使用s:decorate="/layout/template.xhtml,因为template.xhtmledit.xhtml会添加它们自己的id。

所以要这样做:

代码语言:javascript
复制
<h:form prependId="false">
<a4j:repeat value="#{foo}" var="f" rowKeyVar="row">

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

这将使id类似于:unique1 unique2 unique3 etc

更新

看起来你是对的。由于某些原因,id标记不支持这种类型的EL表达式。

我尝试了以下几种方法:

代码语言:javascript
复制
<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。

代码语言:javascript
复制
<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">

所以如你所见,我仍然有一个唯一的id,因为。可能是自动为我添加号码。

添加与否都无关紧要。结果是一样的。

票数 1
EN

Stack Overflow用户

发布于 2011-02-01 02:03:40

也许有用:您可以使用#{rich:clientId('id')}获取JSF (RichFaces)中的真实id。所以您可以在JS中使用生成的id。

票数 1
EN

Stack Overflow用户

发布于 2012-02-07 18:07:07

我不知道您为什么不让JSF为您生成ID,但我知道这并不容易,因为在我看来,JSF关于这个主题的文档很少。

我将通过一个示例(顺便使用JSF 2.0.3 Mojarra )来告诉您我在这个主题上的发现:

代码语言:javascript
复制
<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个项目的列表大小呈现时发生的情况:

代码语言:javascript
复制
<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的生成如下:

  • 为所有h:form元素提供ID,这将使用此ID作为此表单中所有元素的前缀。如果您不想在每个元素前添加表单ID,请在h:form element

中添加属性prependid=“

  • 为所有ui:

元素提供id (即使规范中没有指定ID属性)

  • 为所有h:inputText和其他输入元素提供ID,甚至在ui:repeat元素内也是如此它们将根据它们在循环中的位置获得唯一的ID
  • 您可以为f:

specs元素提供ID,但它们不会被考虑在内

  • 您可以使用varStatus对象作为ID的后缀,但这将始终返回空字符串,这可能是因为在生成动态ID时,varStatus对象不存在

<代码>F219

我希望这能澄清一些关于ID生成的困惑!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4776793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档