2009-05-08 19 views
3

私は、指定された一連のイメージのイメージ遷移をレンダリングするカスタムJSFコンポーネントを作成しています。コンポーネントによって使用されるイメージのリストは、コンポーネントのユーザーによって指定されます。カスタムJSFコンポーネントの属性リスト

メインコンポーネントはレンダリングを行い、生成されるマークアップはhtmlではありません。

私はちょうどJSFを学んだし、カスタムコンポーネントにパラメータの属性のリストを渡すために設立されたパターンがある場合、私は思っていた:

ユーザーは、このような属性を渡すために期待されるだろう:
<i:imageComponent width="480" height="320" imageUrls="img1Url1, imgUrl2" imageCaptions="imageCaption1, imageCaptions2"/>

そして、これらの属性をコンバータを使用してサーバのリストに変換するか、 これはもっと自然でしょうか?私の場合は

<i:imageComponent width="480" height="320">
<i:image id="im1" href="url1" caption="caption1"/>
<i:image id="im2" href="url2" caption="caption2"/>
<i:imageComponent/>

私はちょうどに渡すための自然な方法であるかを把握したいので、すべてのレンダリングを行うことになるメインimageComponentコンポーネントの属性のリスト

答えて

3
<i:imageComponent width="480" height="320" imageUrls="img1Url1, imgUrl2" 
    imageCaptions="imageCaption1, imageCaptions2"/> 

このデザインでは、2つの別々のリストを同期させておく必要があるため、エラーが発生しやすくなります。

<i:imageComponent width="480" height="320"> 
    <i:image id="im1" href="url1" caption="caption1"/> 
    <i:image id="im2" href="url2" caption="caption2"/> 
<i:imageComponent/> 

が含まれる画像の固定数を定義するためにコンポーネントの消費者を必要とするので、この設計は、制限されます。少なくとも最初のデザインでは、imageUrlsimageCaptions属性は、EL式を使用して動的値にバインドできます。それは値を反復処理するために使用できるインターフェイスを -


は、コンポーネントのためのmodelの定義について考えてみてください。たとえば、UIData(コンポーネントタイプはh:dataTable)はDataModelを使用して内容を処理します。詳細はspecを参照してください。

これは、このようなタグの設計につながる可能性:

<i:imageComponent width="480" height="320" 
     value="#{backingBean.imageModel}" /> 

このアプローチでは、ビューではあまり混乱を必要とします。代わりに、モデルの


、(適切な結合タイプを提供するユーザ/開発者に依存しているであろう)リピータ設計を考慮してください

<i:imageComponent width="480" height="320" 
     value="#{backingBean.someIterable}" var="img" > 
    <i:image href="#{img.href}" caption="#{img.caption}"/> 
<i:imageComponent/> 

このアプローチは、任意の特別なタイプを必要としないという利点を有していますバックエンドで

+0

私はリピータのデザインは気にしませんが、それは私も "イメージ"コンポーネントを定義する必要がありますか? メインの「imageComponent」レンダラーはすべてのレンダリングを行う必要があるため、イメージタグで指定された情報を含むすべての情報が必要な問題です。また、画像タグにはレンダリングがありません。これは典型的なコンポーネントですか? –

+0

レンダリングしないコンポーネントがあればOKです(h:columnを参照)。 UIComponent.getRendersChildrenも参照してください。http://java.sun.com/javaee/5/docs/api/javax/faces/component/UIComponent.html#getRendersChildren() – McDowell

関連する問題