3

指定された一連の画像の画像遷移をレンダリングするカスタム 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 であるため、属性のリストをコンポーネントに渡す自然な方法を理解したいだけです。

4

1 に答える 1

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

この設計では、コンポーネントのコンシューマーが含まれるイメージの固定数を定義する必要があるため、制限があります。少なくとも最初の設計では、EL 式を使用してimageUrlsおよびimageCaptions属性を動的な値にバインドできます。


コンポーネントのモデルを定義することを考えてみてください。これは、値を反復処理するために使用できるインターフェースです。たとえば、UIData ( h:dataTableの基になるコンポーネント タイプ) は、DataModelを使用してそのコンテンツを処理します。詳細については、仕様を参照してください。

これにより、次のようなタグ デザインが作成される可能性があります。

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

このアプローチには、バックエンドで特別な型を必要としないという利点があります。

于 2009-05-08T19:44:05.550 に答える