0

リストをループし、そのようにレンダリングする値列を持つデータテーブルがあります。

<h:dataTable var="assessmentFieldValue" value="#{assessmentBean.assessmentFieldValues}">
    ...
    <ui:fragment rendered="#{assessmentFieldValue.field.type eq 'TEXT'}">
        <h:inputText value="#{assessmentFieldValue.value}" />
    </ui:fragment>
    <ui:fragment rendered="#{assessmentFieldValue.field.type eq 'SLIDER'}">
        <component:slider value="#{assessmentFieldValue.value}" />
    </ui:fragment>
    ...
</h:dataTable>

したがって、標準のinputTextを取得することもあれば、複合スライダーコンポーネントを取得することもあります。

<composite:interface>
    <composite:attribute name="value" />
</composite:interface>

<composite:implementation>
    <script type="text/ecmascript">
        function updateValue(value) {
            $('##{cc.id} span').each(function() {
                $(this).text(value);
            });
        }
    </script>

    <div id="#{cc.id}">
        <input id="sliderComponent" type="range" min="1" max="10"
                value="#{cc.attrs.value}"
                style="float: left"
                onchange="javascript:updateValue(this.value);" />

        <h:outputText id="fieldValue" value="#{cc.attrs.value}"
                style="min-width: 20px; display: block; float: left" />
    </div>
</composite:implementation>

これもすべて希望どおりにレンダリングされます(JBoss-AS7にデプロイされます)が、データテーブルに関連付けられた保存ボタンを押すと、assessmentBean.assessmentFieldValueリストはスライダーコンポーネントの値の変更を反映しません、標準では反映されます入力テキスト。

スライダーを変更してもバッキングBeanに戻らない理由を誰かが提案できますか?ありがとう!

4

1 に答える 1

3

<input>これは、のような完全に価値のあるJSF入力コンポーネントの代わりにプレーンなHTML要素を使用したためです<h:inputText>。このように、値はJSFコンテキストにバインドされません。これは、入力値としてではなく、プレーンなバニラテンプレートの出力値としてのみ扱われます。複合コンポーネントはこれを解決しません。あなたは本当にこれにふさわしいものを作成する必要がありますUIComponent(または、PrimeFacesのような厄介な仕事をすでに行っているサードパーティのコンポーネントライブラリを探す必要があります<p:slider>)。

参照:

于 2011-09-05T13:02:56.497 に答える