2008-11-25 51 views
5

我正在研究一個Seam應用程序時遇到了一些問題,我想知道是否有人知道它的方法。我的應用程序中有一個表單,它使用AJAX根據下拉框中的項目顯示某些輸入框。代碼工作正常,除了在我的輸入框中設置ID。它看起來像JSF不讓我通過變量設置ID。其他屬性如標籤中的「for」都很好。這裏有一些代碼解釋我的意思:JSF/Seam中的動態標識

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

有沒有人有任何想法我可以通過這個?

回答

8

你明白他們爲什麼不讓你設置ID,對吧? JSF接管了id創建,因爲你處於重複的組件循環中,如果它們讓你設置id,那麼最終會出現重複的id,這對你無能爲力。

不知道爲什麼你想明確設置ID,很難給你一個解決方法。如果是JavaScript的話,你可以做Grant Wagner建議的東西,讓JSF爲你提供它作爲id的東西。您也可以在生成的HTML偷看,看看ID是什麼格式。JSF通常使用

"form_id:loop_id:loop_index:component_id" 

,因爲它生成的表單/重複組件的ID。你必須確定,並給你的表單和用戶名:重複標籤,以瞭解他們是什麼。

好的,你回答說你想要在循環內有一個特定inputText的h:message標記,這很容易。

<h:inputText id="myInput" .... /> 
<h:message for="myInput" ... /> 

現在,對於輸入生成的消息將被顯示在該消息中,和JSF將裂傷的「for」屬性(儘管不生成到HTML),就像它會爲「id」屬性中inputText使它們匹配。

你甚至可以在你的處理程序代碼中使你的OWN消息轉到特定的h:消息,但是你需要使用一個對clientId的調用來獲取消息的目標,因爲支持bean(而不是值支持bean)的組件。

+0

哎呦。我離開了這一段時間沒有我。我明白爲什麼我不能在一個循環中分配ID,但是我知道我在設置什麼,因爲對於循環中的每次迭代,ID(labelKey)都是唯一的。 – 2009-01-27 14:58:05

3

我假設你想控制你的輸入組件的ID,以便以後可以在Javascript中引用它?在後面的代碼

<h:inputText id="whatever" value="..." /> 

然後:

由於無法通過表情設定的ID,我做這

<script type="text/javascript"> 
var theElement = document.getElementById('<h:outputText value="#{pagecode.whateverClientId}"/ >'); 
... 
</script> 

在pagecode:

protected HtmlInputText getWhatever() { 
    if (whatever == null) { 
     whatever = (HtmlInputText) findComponentInRoot("whatever"); 
    } 
} 

public String getWhateverClientId() { 
    return getWhatever().getClientId(getFacesContext()); 
} 

希望有所幫助。

+0

我有一個相當的問題。你的回答並不直接解決它,但它給了我一個有用的提示。有時候,甚至提示都可以挽救生命。謝謝;) – hirikarate 2012-01-10 04:33:56

0

您是否嘗試過使用facelets?

這將讓你assing自己的ID,即:

我:那麼labelKeyThingo可以使用id =#{} labelKey作出獨特的標籤。這裏是被稱爲米的例子的facelet:textPassword從我的錯誤代碼:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:c="http://java.sun.com/jstl/core" xmlns:a4j="http://richfaces.org/a4j" 
    xmlns:rich="http://richfaces.org/rich"> 

    <ui:composition> 

    <c:set var="styleClass" value="formPrompt" /> 
    <c:set var="requiredLabel" value="" /> 
    <c:choose> 
     <c:when test="${required=='true'}"> 

      <c:set var="required" value="true" /> 
      <c:set var="styleClass" value="formRequiredPrompt" /> 
      <c:set var="requiredLabel" value="*" /> 
     </c:when> 
    </c:choose> 

    <h:panelGroup id="#{id}_formRowTemplateLabel_panelGroup"> 
     <h:outputLabel for="#{id}" styleClass="#{styleClass}" id="#{id}_formRowTemplate_outPut" 
      value="#{label}" /> 
     <c:if test="${required == 'true'}"> 
      <h:outputText value="#{requiredLabel}" styleClass="formRequiredPromptAsterix"></h:outputText> 
     </c:if> 
    </h:panelGroup> 

    <h:panelGroup id="#{id}_textPasswordTemplate_panelGroup"> 
     <h:inputSecret required="${required}" id="#{id}" value="#{property}" 
      styleClass="formText"> 

      <f:validator validatorId="Maserati.Password" /> 
      <f:validateLength maximum="16" minimum="8" /> 
      <ui:insert name="additionalTags"></ui:insert> 
     </h:inputSecret> 

     <h:message styleClass="formErrorMsg" id="#{id}_textPasswordTemplate_msg" for="#{id}" /> 
    </h:panelGroup> 

    </ui:composition> 

    </html> 

它正是如此使用:

<m:textPassword id="password" label="#{msgs.passwordPrompt}" 
property="#{individualApplicationMBean.password}" 
required="true" maxlength="16" />