JSF/Seam中的动态ID

Lee*_*ald 5 jsf seam

我正在研究的S​​eam应用程序遇到了一些问题,我想知道是否有人知道它的方法.我的应用程序中有一个表单,它使用AJAX显示某些输入框,具体取决于下拉框中的项目.除了在输入框中设置ID之外,代码工作正常.看起来JSF不允许我通过变量设置ID.标签中的"for"等其他属性也没问题.这里有一些代码解释了我的意思:

<ui:repeat value="#{serviceHome.instance.serviceSettings}" var="currSetting" >
  <li>
    <!-- Imagine the below works out as "settingABC" -->
    <c:set var="labelKey" value="setting#{jsfUtils.removeWhitespace(currSetting.key.name)}" />

    <!-- Labelkey is correctly added into this input so for = "settingABC" -->
    <h:outputLabel for="#{labelKey}" styleClass="required generated" value="#{currSetting.key.name}:"/>

    <s:decorate styleClass="errorwrapper">

      <!-- Labelkey ISN'T correctly added into this input. Instead we just get "setting" -->
      <h:inputText id="#{labelKey}" value="#{currSetting.value}"/>

      <a4j:outputPanel ajaxRendered="true">
        <h:message for="#{labelKey}" styleClass="errormessage" />
      </a4j:outputPanel>
    </s:decorate>
  </li>
</ui:repeat>
Run Code Online (Sandbox Code Playgroud)

有谁知道我怎么能超越这个?

bil*_*dev 8

你明白他们为什么不让你设置ID,对吧?JSF接管id创建,因为你在重复的组件循环中,如果他们让你只设置id,你最终会得到重复的ID,这对你无论如何都无济于事.

在不知道为什么要明确设置ID的情况下,很难为您提供解决方法.如果是JavaScript,你可以做Grant Wagner所建议的,让JSF给你它作为id的内容.您还可以查看生成的HTML并查看id所在的格式.JSF通常使用

"form_id:loop_id:loop_index:component_id" 
Run Code Online (Sandbox Code Playgroud)

作为它为表单/重复中的组件生成的id.您必须确定并为您的表单提供id和ui:重复标记以了解它们是什么.

好的,你回答说你想在循环中为特定的inputText设置一个h:message标签,这很容易.

<h:inputText id="myInput" .... />
<h:message for="myInput" ... />
Run Code Online (Sandbox Code Playgroud)

现在,为输入生成的消息将显示在消息中,并且JSF将破坏"for"属性(尽管这不是生成HTML),就像它将与inputText中的"id"属性匹配一样.

您甚至可以在处理程序代码中生成OWN消息以转到特定的h:消息,但是在给定支持bean(不是值支持bean)的情况下,您需要使用对clientId的调用来获取消息的目标.有问题的组件.