代码之家  ›  专栏  ›  技术社区  ›  Arthur Ronald

使用ajax时如何识别javaserverfaces2.0复合组件?

  •  1
  • Arthur Ronald  · 技术社区  · 15 年前

    我有以下JavaServerFaces2.0复合组件。注意我正在使用 逐字

    resources/customer/customer.xhtml
    
    <composite:interface>
        <composite:attribute name="id" required="false"/>
        <composite:attribute name="firstName" required="false"/>
        <composite:attribute name="lastName" required="false"/>
        <composite:attribute name="age" required="false"/>
        <composite:attribute name="rendered" required="false"/>
    </composite:interface>
    <composite:implementation>
        <f:verbatim id="#{cc.attrs.id}" rendered="#{cc.attrs.rendered}">
            <div>
                <div>
                    <p>First name</p>
                    <h:outputText value="#{cc.attrs.firstName}"/>
                </div>
                <div>
                    <p>Last name</p>
                    <h:outputText value="#{cc.attrs.lastName}"/>
                </div>
                <div>
                    <p>Age</p>
                    <h:outputText value="#{cc.attrs.age}"/>
                </div>
            </div>
        </f:verbatim>
    </composite:implementation>
    

    为了使用ajax,我已经做了(注意 提供 属性)

    <h:form id="search">
    <div>
        <h:commandButton value="Search" action="#{customerSearchController.search}">
            <f:ajax execute="@form" render="search:result"/>
        </h:commandButton>
    </div>
    <customer:customer id="result"
                       rendered="#{customerSearchController.customer != null}"
                       firstName="#{customerSearchController.customer.firstName}"
                       lastName="#{customerSearchController.customer.lastName}"
                       age="#{customerSearchController.customer.age}"/>
    </h:form>
    

    我的CustomerSearchController如下所示

    private Customer customer;
    
    // getter's and setter's
    
    public void search() {
        customer = new Customer();
    
        customer.setFirstName("First");
        customer.setLastName("Last");
    
        customer.setAge(30);
    }
    

    CustomerSearchController和Customer都是托管bean。但当我调用ajax请求时,它会抱怨: 搜索:未找到结果

    我该怎么解决这个问题???

    1 回复  |  直到 15 年前
        1
  •  1
  •   BalusC    15 年前

    <f:ajax render> 应该指向HTML DOM树中的现有客户端ID。但是,自从 search:result 元素在HTML DOM树中不可用,因为它不是由服务器端呈现的,JS/ajax在htmldom树中找不到任何要更新/呈现的内容。

    将它包装在另一个始终在HTML DOM树中可用的元素中,以便Ajax能够找到它。

    <h:panelGroup id="result">
        <customer:customer rendered="..." />
    </h:panelGroup>
    

    与实际问题无关,请注意 f:verbatim 应该只包含逐字(纯HTML),而不是JSF组件。替换为 h:panelGroup .