0

私たちのアプリケーションでは、メニューを動的に表示しています。メニュー オブジェクト (以下のコードでは menuitems) にすべてのメニュー項目 (xml から読み取ったもの) が取り込まれています。次に、ホームページは ui:repeat を使用してメニューを生成します。Insdie ui:repeat p:commandlink があります。以下はコードです

   <h:form id="mainMenu">
    <h:panelGroup id="MMPanel" layout="block" styleClass="left_menu">
        <ui:repeat var="node" value="#{menuitems.level1menus}">
            <p:commandLink immediate="true" styleClass="menu" 
                action="#{menuitems.onLevel1MenuChange(node.id)}"
                update=":pageTitle :menuLevel2 :menuLevel3" title="#{node.name}" 

                rendered="#{menuitems.selectedLevel1.id!=node.id}" onclick="menuSelect(this)">
                <span class="icon icon_#{node.name}"></span>
                <span class="text">#{node.name}</span>
</p:commandLink>

                <p:commandLink immediate="true" styleClass="menu activelink" 
                action="#{menuitems.onLevel1MenuChange(node.id)}"
                update=":pageTitle :menuLevel2 :menuLevel3" title="#{node.name}"

                rendered="#{menuitems.selectedLevel1.id==node.id}"  onclick="menuSelect(this)">
                <span class="icon icon_#{node.name}"></span>
                <span class="text">#{node.name}</span>
    </p:commandLink>

        </ui:repeat>
        </h:panelGroup>         
    </h:form>

menuitems Bean はセッション レベルにあります。ui:repeat 内には 2 つの異なる p:commandlink があります。2 つの唯一の違いは、スタイルクラスとレンダリングされた属性にあります。これは、ユーザーが初めてログインしたときにデフォルトのメニュー項目を識別し、「activeLink」の追加の CSS を与えるために行われます。onclick で呼び出される Java スクリプトを以下に示します (必要な場合)。

    function menuSelect(selectOne){
        $(".left_menu>a").removeClass("activelink");
        $(selectOne).addClass("activelink");
        removeAllChannels();
    }
    function removeAllChannels(){
            $.atmosphere.unsubscribe();
      }

removeAllChannels は、持っている primepush 自動更新チャネルを削除することです。

私が直面している問題はこれです。すべてのリンクが正しくレンダリングされており、Firebug ではすべてのリンクが同じ html になっていることがわかります。しかし、余分なcss「activeLink」で生成されたもの(レンダリングされた条件 - menuitems.selectedLevel1.id==node.id)は機能していません。このデフォルトのリンクをクリックしても何も起こりません。他のすべてのリンクは正常に機能します。そのため、別のリンクをクリックすると、必要なページに移動します。しかし、デフォルトのメニューをクリックしても何も起こらず、カスタム フェーズ リスナーを追加したところ、このリンクをクリックするとすべてのライフサイクル ステージが呼び出されることがわかりましたが、アクション メソッドは呼び出されません。thisthisのリンクを調べましたが、問題を理解できませんでした。助けてください。不明な点があれば教えてください

4

1 に答える 1

1

改ざん/ハッキングされたリクエストに対する保護の一環としてrendered、フォーム送信の処理中に JSF コンポーネントの属性が再評価されます。コマンド リンク/ボタンの場合、それが と評価された場合false、そのアクションはキューに入れられたり呼び出されたりしません。これは、あなたが見ている症状と一致します。

これは、マネージド Bean#{menuitems}がリクエスト スコープである場合、および/またはポストバック リクエストの背後にあるプロパティ#{menuitems.level1menus}または互換性のない変更が行われた場合に発生する可能性があります。#{menuitems.selectedLevel1}

Bean をビュー スコープに配置し、ゲッターがビジネス ジョブを実行しないようにすることで、この問題を解決できます。

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

于 2012-12-12T12:04:10.203 に答える