2

ブール値を に取得しましたが、 の- 属性<h:inputText>に取得する方法が見つかりません。また、Bean 値を使用する方法もわかりません。これは、反復ごとに独自の値が必要になるためです。rendered<h:panelGroup>

これは私のjsfコードです:

<ui:repeat var="item" value="#{itemBean.items}" id="iterateItems" varStatus="iteration">
    <script type="text/javascript">         
        showItem("#{item.id}","#{iteration.index}");
    </script>
    <h:inputText id="rendered"/>
    <h:panelGroup layout="block" rendered="???">
        Iteration #{iteration.index} rendered
    </h:panelGroup>
</ui:repeat>

これは私のJavaScriptです:

function showItem(item,iteration){
    if((clientSideValue==something){
        document.getElementById("iterateItems"+":"+iteration+":"+"rendered").value = true;
    }
    else{
        document.getElementById("iterateItems"+":"+iteration+":"+"rendered").value = false;
    }
}
4

3 に答える 3

3

JavaScript はクライアント側で実行され、サーバー側から取得された HTML DOM ツリーで動作します (特定のケースでは JSF によって生成されます)。したがって JavaScript は、表示/非表示にしたい目的の HTML 要素が常にHTML DOM ツリーに存在することを期待しています。

JSF はサーバー側で実行され、JSF コンポーネント ツリー (「ビュー」) に基づいて HTML コードを生成します。renderedJSF コンポーネントの属性が に評価さfalseれると、指定されたコンポーネントの HTML コードは生成されないため、HTML DOM ツリーには何も生成されず、JavaScript の で選択できるものは何もありませんdocument.getElementById()

これが解決策になると考えていた具体的な機能要件が不明であるため、具体的な問題に対する適切な解決策を提案することは困難です。ただし、表示/非表示をサーバー側 (JSF) ではなくクライアント側 (JavaScript) で実行する必要があることを完全に確信している場合は、CSS のdisplayプロパティを使用する必要があります。blocknone

以下は基本的なキックオフの例です。最初は非表示にすることを前提としています。

<ui:repeat var="item" value="#{itemBean.items}" id="iterateItems" varStatus="iteration">
    <script type="text/javascript">         
        showItem(#{iteration.index});
    </script>
    <h:inputText id="rendered" />
    <div id="foo#{iteration.index}" style="display:none">
        Iteration #{iteration.index} shown
    </div>
</ui:repeat>

function showItem(index) {
    var div = document.getElementById("foo" + index);

    if (someCondition) {
        div.style.display = "block"; // Show it.
    } else {
        div.style.display = "none"; // Hide it.
    }
}
于 2012-12-04T16:08:44.023 に答える
2

サーバー側スクリプトとクライアント側スクリプトを混在させないでください!

必要に応じてELを使用してください:

<ui:repeat var="item" value="#{itemBean.items}" id="iterateItems" varStatus="iteration">
    <h:panelGroup layout="block" rendered="#{item.id le 1}">
        Iteration #{iteration.index} rendered
    </h:panelGroup>
</ui:repeat>
于 2012-12-04T12:36:31.300 に答える
1

それは不可能です。JSFタグ-特にレンダリングされた属性はRenderResponse、JSFのフェーズ中に使用されます。最終的なHTMLが生成されると、属性はなくなりrenderedます。その属性を含むHTML要素は、レンダリングされるかどうかに関係なく表示されます。

したがって、クライアントの値に応じて何かを行う必要がある場合は、その値をサーバーに転送する必要があります。

回避策は、css-propertyを設定することdisplay:noneです。ただし、これは要素を表示しないことに注意してください。それはまだページソースで利用可能です。

Javascriptを使用している場合は、最終的なソースコードを実際に確認する必要があります。JSFタグは解決され、のような自動生成されたIDでさえ23:58:23、特定の要素で常に同じであるとは限りません。

于 2012-12-04T16:07:38.300 に答える