0

Ajax を使用したコンポーネントの更新がどのように機能するかを理解できないようです。「「j_idt12:0:j_idt16:j_idt76」から参照される識別子「:menu-item-container」を持つコンポーネントが見つかりません」という例外が引き続き発生します。

これは私のコードです:

<!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">

    <f:view contentType="text/html">
    <h:head>
        <title><ui:insert name="pageTitle"></ui:insert></title>
    </h:head>

    <h:body>
        <h:outputStylesheet library="css" name="style.css" />
        <div class="menu-navigation">
            <ul>
                <li>Menu</li>
                <ui:repeat var="category"
                    value="#{restaurantsBean.restaurant.categories}">
                    <h:form>
                        <li><p:commandLink update=":menu-item-container">
                                <div>
                                    #{category.name}
                                    <f:setPropertyActionListener              value="#{category.id}"
                                        target="#                   {restaurantMenuBean.selected}" />
                                </div>
                            </p:commandLink></li>
                    </h:form>
                </ui:repeat>
            </ul>
        </div>

        <div id="menu-item-container">

            <ui:repeat var="category"
                value="#{restaurantsBean.restaurant.categories}">
                <p:outputPanel>
                    <h:panelGroup id="pangroup" layout="block"
                        rendered="#{restaurantMenuBean.active(category.id)}">
                        <div class="some-heading">
                            <h2>#{category.name}</h2>
                        </div>
                        <div class="category-description">#{category.description}</div>

                        <ui:repeat var="item" value="#{category.items}">
                            <p:outputPanel
                                rendered="#{restaurantMenuBean.needLightbox(item)}">
                                <ui:include src="/lightbox-item.xhtml"></ui:include>
                            </p:outputPanel>
                            <p:outputPanel
                                rendered="#{!restaurantMenuBean.needLightbox(item)}">
                                <ui:include src="/nolightbox-item.xhtml"></ui:include>
                            </p:outputPanel>
                        </ui:repeat>

                    </h:panelGroup>
                </p:outputPanel>
            </ui:repeat>

        </div>
    </h:body>
    </f:view>
    </html>

これは、HTML ソース出力の関連領域であり、「menu-item-container」がルートにあり、update-attribute には ID の前に分離マーカー「:」のみが必要であることがわかります。

<div id="menu-item-container"><span id="j_idt17:0:j_idt64"></span><span id="j_idt17:1:j_idt64"><div id="j_idt17:1:pangroup">
                        <div class="some-heading">
4

1 に答える 1

2

更新されるコンポーネントは、 で説明されているアルゴリズムを使用して解決されUIViewRoot#findComponent()ます。完全な JSF コンポーネントしか検出できないことは明らかです。

ただし、あなたmenu-item-containerはプレーンな HTML<div>要素であるため、JSF コンポーネント ツリーでは使用できません。

完全な JSF コンポーネントに置き換えてください。

<h:panelGroup id="menu-item-container" layout="block">

<h:panelGroup>デフォルトで a<span>をレンダリングし、layout="block"はそれを に変換し<div>ます。

于 2012-10-25T11:35:50.403 に答える