11

私は次のコードを持っています:

<ui:repeat var="class2" value="#{bean.list}" varStatus="status">
  <h:form id="#{class2.name}"> 
    <h:outputText value="#{class2.name}" />
  </h:form>
</ui:repeat>

ただし、ページを開くと、次のようなエラーが発生します。

コンポーネント識別子は長さゼロの文字列であってはなりません

しかし、それは適切に印刷されてい<h:outputText>ます。これはどのように発生し、どうすれば解決できますか?

4

1 に答える 1

25

JSF コンポーネントの属性で EL を使用できますが、JSF コンポーネント ツリーが構築される間、ビューの構築時idに EL 変数を使用できる必要があります。ただし、 はビューのレンダリング時に実行されますが、HTML 出力は JSF コンポーネント ツリーに基づいて生成されます。ビューのビルド時には利用できず、エラーを完全に説明するものに評価されます。それが機能するのは、ビューのレンダリング時に実行されるためです。<ui:repeat><ui:repeat var>#{class2.name}null<h:outputText>

ビューのビルド時に実行<ui:repeat>されるに置き換えると、意図したとおりに機能します。<c:forEach>つまり、は JSF コンポーネント ツリー内に<c:forEach>物理的に複数の<h:form>コンポーネントを生成し、それぞれが独自の HTML 出力を個別に生成します (<ui:repeat>まったく同じ<h:form>コンポーネントを何度も再利用して HTML 出力を生成する とは対照的です)。

<c:forEach var="class2" items="#{bean.list}" varStatus="status">
  <h:form id="#{class2.name}"> 
    <h:outputText value="#{class2.name}" />
  </h:form>
</c:forEach>

しかし、なぜそれをする必要があるのか​​ 本当に疑問に思います。通常、コンポーネント ID を動的に割り当てる必要はありません。JSF は ID の一意性を保証します。以下の例では、

<ui:repeat var="class2" value="#{bean.list}" varStatus="status">
  <h:form id="form"> 
    <h:outputText value="#{class2.name}" />
  </h:form>
</ui:repeat>

の反復インデックスが接尾辞として付けられた一意の ID を持つ複数の形式になり<ui:repeat>ます。実際に#{class2.name}JavaScript/jQueryの目的で使用する必要がある場合(これが正しい解決策であると考えた質問で、具体的な機能要件をどこにも述べていないため、単なる推測です)、単純なバニラでラップするだけですHTML 要素:

<ui:repeat var="class2" value="#{bean.list}" varStatus="status">
  <div id="#{class2.name}"> 
    <h:form id="form">
      <h:outputText value="#{class2.name}" />
    </h:form>
  </div>
</ui:repeat>

または、CSS セレクターを介して選択できる JSF コンポーネントのスタイル クラスとして設定します。

<ui:repeat var="class2" value="#{bean.list}" varStatus="status">
  <h:form id="form" styleClass="#{class2.name}">
    <h:outputText value="#{class2.name}" />
  </h:form>
</ui:repeat>

以下も参照してください。

于 2013-08-21T13:36:27.923 に答える