私たちのアプリケーションでは、メニューを動的に表示しています。メニュー オブジェクト (以下のコードでは 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)は機能していません。このデフォルトのリンクをクリックしても何も起こりません。他のすべてのリンクは正常に機能します。そのため、別のリンクをクリックすると、必要なページに移動します。しかし、デフォルトのメニューをクリックしても何も起こらず、カスタム フェーズ リスナーを追加したところ、このリンクをクリックするとすべてのライフサイクル ステージが呼び出されることがわかりましたが、アクション メソッドは呼び出されません。thisとthisのリンクを調べましたが、問題を理解できませんでした。助けてください。不明な点があれば教えてください