5

私が取り組んでいるSeamアプリケーションで少し問題が発生し、誰かがそれを回避する方法を知っているかどうか疑問に思いました。ドロップダウンボックスの項目に応じて、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>

誰かが私がこれを乗り越えることができる方法を知っていますか?

4

3 に答える 3

8

IDを設定できない理由がわかりますよね?コンポーネントのループが繰り返されているため、JSFがIDの作成を引き継ぎます。IDを設定するだけでIDを設定できる場合は、IDが重複することになり、とにかく役に立ちません。

IDを明示的に設定する理由がわからないと、回避策を提供するのは困難です。JavaScriptの場合は、Grant Wagnerが提案することを実行し、JSFにIDとして配置されたものを提供させることができます。生成されたHTMLを確認して、IDの形式を確認することもできます。JSFは通常、

"form_id:loop_id:loop_index:component_id" 

フォーム/リピートのコンポーネントに対して生成するIDとして。フォームとui:repeatタグにIDを付けて、それらが何であるかを確認する必要があります。

わかりました。ループ内の特定のinputTextにh:messageタグを付けたいと答えましたが、これは簡単です。

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

これで、入力用に生成されたメッセージがメッセージに表示され、JSFはinputTextの「id」属性と同じように「for」属性をマングルします(HTMLには生成されません)。

ハンドラーコードで独自のメッセージを作成して特定のh:messageに移動することもできますが、バッキングBean(値のバッキングBeanではない)を指定して、clientIdの呼び出しを使用してメッセージのターゲットを取得する必要があります。問題のコンポーネントの。

于 2008-11-28T18:32:04.460 に答える
3

後でJavascriptで参照できるように、入力コンポーネントのIDを制御したいと思いますか?

式を使用してIDを設定することはできないため、次のようにします。

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

その後、コードの後半で:

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

ページコード:

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

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

お役に立てば幸いです。

于 2008-11-25T19:07:15.540 に答える
0

Faceletsを使ってみましたか?

これにより、次のように自分の ID を割り当てることができます。

me:labelKeyThingo は、id=#{labelKey} を使用して一意のラベルを作成できます。これは、私の悪いコードからのm:textPasswordという facelet の例です。

   <!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" />
于 2009-03-19T06:45:57.070 に答える