0

私は2つのjsfページを持っています。layout.xhtml と page.xhtml。レイアウトは次のようになります。

<ui:composition>                                                                                                                      
<h:panelGroup id="menu" layout="block">                                                                                           
    <h:outputText value="#{menuBean}" />                                                                                          
    <h:form>                                                                                                                      
        <ui:repeat var="menuItem" value="#{menuBean.menuItems}">                                                                  
            <button:menuItem label="#{msgs[menuItem.label]}" action="#{menuBean.selectItem(menuItem.label)}" update="#{update}" />
        </ui:repeat>                                                                                                              
    </h:form>                                                                                                                     
</h:panelGroup>                                                                                                                   
<ui:repeat var="menuItem" value="#{menuBean.menuItems}">                                                                          
    <h:panelGroup layout="block" rendered="#{menuBean.selectedItemLabel eq menuItem.label}">                                      
        <ui:include src="#{menuItem.page}" />                                                                                     
    </h:panelGroup>                                                                                                               
</ui:repeat>                                                                                                                      

そして、このようなページ:

<h:panelGroup binding="#{page}" layout="block">             
    <ui:decorate template="../template.xhtml">                   
        <ui:param name="menuBean" value="#{pageBean}" />        
        <ui:param name="update" value=":#{page.clientId}" />
    </ui:decorate>
</h:panelGroup> 

初めてページをレンダリングするときはすべて問題ありません(menuItemsがレンダリングされるなど)。ボタンをクリックすると、 が表示されますTarget Unreachable, identifier 'menuBean' resolved to null

menuBeanが再度割り当てられない理由と、この種のことを達成する別の方法が存在する場合(一般的なレイアウトページを作成し、そこにオブジェクトを渡してページを生成する)、何が起こっているのか説明できますか? 私の豆はSpringによって管理されています。

アップデート:

問題は、次のような複合ボタンに何らかの形で関連していると思います。

<composite:interface name="menuItem">                                                                                                
    <composite:attribute name="action" targets="button" />                                                                           
    <composite:attribute name="styleClass" />                                                                                        
    <composite:attribute name="label" />                                                                                             
    <composite:attribute name="update" />                                                                                            
    <composite:attribute name="rendered" />                                                                                          
    <composite:insertChildren />                                                                                                     
</composite:interface>                                                                                                               

<composite:implementation>                                                                                                           
    <h:commandButton id="button" value="#{cc.attrs.label}" style="width: 150px;" action="#{cc.attrs.action}"                         
        rendered="#{empty cc.attrs.rendered ? true : cc.attrs.rendered}" styleClass="menu-item #{cc.attrs.styleClass}" type="button">
        <f:ajax render="#{cc.attrs.update}" />                                                                                       
    </h:commandButton>                                                                                                               
</composite:implementation> 

タグを標準の h:commandButton に置き換えると、すべてが完全に機能します。オブジェクトをテンプレートに渡し、テンプレートは渡されたオブジェクトをコンポジットに渡していますが、間違いなく何かが欠けています。

4

2 に答える 2

0

問題は豆の範囲に関係していると思います。私が理解しているように、pageBeanバッキングBeanにはリクエストスコープがあります。スコープを広い方に変更してみてください(ビュースコープ@ViewScopedである必要があります)。JSFの代わりにCDIアノテーションを使用する場合は、@ ConversationalScopeを確認できます(または、Luiggiが指摘したようにMyFacesCODIライブラリを使用できます)。

于 2013-02-10T17:03:21.170 に答える
0

私がBalusCに直面している問題は、彼のブログスポットで既に説明されています: http://balusc.blogspot.cz/2011/09/communication-in-jsf-20.html#ViewScopedFailsInTagHandlers

簡単に言えば、ポストバック要求 (ボタンの ajax 更新) の時点で、複合ボタンに渡された Bean が存在しません。BalusC が指摘したように、解決策は複合ショートカットを使用する代わりに標準の UIComponent を作成することです。

于 2013-02-20T22:42:09.150 に答える