2011-01-23 39 views
0

我遇到了a4j:repeat的问题,它是id代的。循环内的每个元素都有一个唯一标识符的ID。我不想要这个。我想要某些元素包含我呈现的ID(我确保它们是唯一的)。煤层/ RichFaces + forceId

我搜索了四周,它看起来像战斧标签有一个属性forceId这将导致元件使用提供的ID。唯一的问题是,看起来不推荐在Seam/RichFaces中使用Tomahawk标签。

上有什么建议与Seam使用标签库中的任何一个相似?除此之外,对于我来说,继承a4j:repeat(或者甚至可能是ui:repeat)并改变它处理id代的方式是合理可行的吗?

任何想法?我需要的只是一种通过元素循环的方式,让它们具有动态ID。

回答

1

这不是一个RichFaces问题。这是JSF。 JSF为每个组件添加一个唯一的ID。这是一个已知的JSF功能。

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

(还要确保您使用的不是s:decorate="/layout/template.xhtml因为template.xhtmledit.xhtml将增加自己的ID的

所以做这样的事情:

<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表达式。

我试过如下:

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

因此,大家可以看到,我仍然得到一个唯一的ID,因为。可能会自动为我添加数字。

如果您添加或不没关系。结果是一样的。

+0

这是行不通的。我不认为你能够将EL指定为id的一部分(至少不在重复元素内)。在我身边的EL要么被评价为0或者什么都没有,尽管同样的表达在其他地方正确评估(例如,它工作在outputPanel的title属性而不是id属性中)。如果我能做到这一点,我的问题就会解决。 – NRaf 2011-01-24 20:58:32

1

或许有用:{:的clientId( '身份证')}丰富,您可以用#得到真正的IDS在JSF(RichFaces的)。所以你可以在JS中使用生成的ID。

0

我不知道为什么你会不会让JSF为你做的ID生成,但我明白,这是不容易弄清楚,因为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项的列表大小来呈现发生了什么:所以ID生成如下

<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:表单元素,这将前缀在这种形式的所有元素与此ID
    • 如果你不想前缀每个元素的形式ID,添加属性prependid =“假”到H:表单元素
  • 给ID来所有的UI:重复元素(尽管在规范中没有指定的id属性)
  • 给ID来所有H:inputText的和其它输入元素,甚至里面的UI:重复的元素,他们将获得基于一个唯一的ID它们在环位置
  • 你可以把标识到f:selectItems的元素,但他们不会被考虑
  • 可以后缀与varStatus对象的ID,但是这总是会返回一个空字符串,可能是因为当生成varStatus对象不存在的动态ID

我希望这可以清除一些关于ID基因的混淆配给!