【问题标题】:Seam / RichFaces + forceId接缝/RichFaces + forceId
【发布时间】:2011-06-14 04:34:12
【问题描述】:

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

我四处搜索,似乎 Tomahawk 标签有一个属性 forceId,它将导致元素使用提供的 id。唯一的问题是,似乎不建议将 Tomahawk 标签与 Seam / RichFaces 一起使用。

推荐与 Seam 一起使用的任何标签库中是否有类似的东西?除此之外,对我来说,继承 a4j:repeat(甚至可能是 ui:repeat)并改变它处理 id 生成的方式是否合理可行?

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

【问题讨论】:

    标签: jsf richfaces seam facelets


    【解决方案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,因为。可能是自动为我添加号码。

    加不加都没关系。结果是一样的。

    【讨论】:

    • 它不工作。我认为您不能将 EL 指定为 id 的一部分(至少不能在重复元素中)。在我这边,EL 要么被评估为 0,要么根本不被评估,尽管相同的表达式在其他地方正确评估(例如,它在 outputPanel 的 title 属性中有效,但在 id 属性中无效)。如果我能做到这一点,我的问题就会得到解决。
    • 看看我的更新。可以看到id是唯一的。为什么你仍然需要一个唯一的 id?是因为一些 jQuery / Javascript 的东西吗?您也可以始终使用我在代码中显示的类来获得“唯一”类
    • 对不起,直到现在才看到这个。我需要唯一 id 的原因是能够使用 RichFaces reRender 属性更新特定行。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我不知道您为什么不让 JSF 为您生成 ID,但我知道这并不容易弄清楚,因为我认为 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生成如下:

      • 为所有 h:form 元素提供 ID,这将在此表单中的所有元素前加上该 ID
        • 如果您不想为每个元素添加表单 ID 前缀,请将属性 prependid="false" 添加到 h:form 元素
      • 为所有 ui:repeat 元素提供 ID(即使规范中未指定 id 属性)
      • 为所有 h:inputText 和其他输入元素提供 ID,即使在 ui:repeat 元素中,它们也会根据它们在循环中的位置获得唯一的 ID
      • 您可以为 f:selectItems 元素提供 ID,但它们不会被考虑在内
      • 您可以使用 varStatus 对象为 ID 添加后缀,但这将始终返回一个空字符串,可能是因为在生成动态 ID 时 varStatus 对象不存在

      我希望这可以消除一些关于 ID 生成的困惑!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-20
        • 2012-01-24
        • 1970-01-01
        • 2012-02-17
        • 2012-04-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多