0

我们有一个要显示在屏幕面板下的列表,其中字段可重复的所有代码都保存在不同的 Facelet 文件下。当我尝试根据侦听器对 ajax 事件的操作来渲染图像时,我在使用 ID 更新图像时遇到了一些问题,因为 JSF 正在生成一个带有中间索引的 ID,因为使用了<ui:repeat>like so repeatForm:repeat:2:redimage

这是主页:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:c="http://java.sun.com/jsp/jstl/core">
    <h:head>
        <title>Repeat Test Demo</title>
    </h:head>
    <h:body>
        <h:form id="repeatForm">
            <ui:repeat id ="repeat" value="#{listBean.xyzList}" var="repeatListVar">
                <p:panel id="genLiabPanelRender">
                    <ui:include src="MyScreen.xhtml" />
                </p:panel>
            </ui:repeat>
        </h:form>
    </h:body>
</html>

此 Facelet 可根据面板中的列表大小重复。

MyScreen.xhtml这是包含 Facelet 文件:

<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.prime.com.tr/ui">

    <h:body class="body">
        <h:panelGrid columns="4" border="0" width="90%">
            <h:panelGroup style="display:block;text-align:left;width: 320px">
                <h:selectBooleanCheckbox value="#{repeatListVar.primaryPolicyInd}" />
                <h:outputText value="#{label.primaryCov}" />
            </h:panelGroup>
            <h:panelGroup style="display:block;text-align:left;width: 240px">
                <h:selectBooleanCheckbox value="#{repeatListVar.abcInd1}" />
                <h:outputText value="#{label.commGenLiab}" />
            </h:panelGroup>
            <h:panelGroup style="display:block;text-align:left;width: 180px">
                <h:outputText value=" #{label.eachOccur}" style="text-align:left" />
            </h:panelGroup>
            <h:panelGroup style="display:block;text-align:left;width: 130px">
                <p:inputMask mask="#{label.limitAmtMask}" id="genLiabEachOccAmt"
                        value="#{repeatListVar.a25GLEOAmt}" required="true"
                        style="width: 90px">
                    <f:ajax event="blur" render="redimage" listener="#{repeatListVar.testA25GLEOAmt}"/> 
                </p:inputMask>
                <h:graphicImage id="redimage" url="/images/icons/redIcon.png" rendered="#{repeatListVar.testA25GLEOAmtInd}" />
            </h:panelGroup>

这最终会生成<h:outputText>如下所示的 ID repeatForm:repeat:2:redimage:. 但是因为我们使用的是<f:ajax>标签,所以我们只需要指定"redimage". 标签负责找出真实 ID 的工作。

我们在侦听器中调用一个方法,并将布尔指标的值设置为true默认falsefalse。该指标用于渲染图像。

但是当我们使用它<f:ajax>来根据指标值渲染图像时,我得到了错误

malformedXML:更新过程中 repeatForm:repeat:2:redimage not found

这是如何引起的,我该如何解决?

4

1 回答 1

2

这应该有效。我只看到两个可能的原因:

  1. 您的 bean 是请求范围的,并且不保留该<ui:repeat>值。修复 bean 构造函数的工作和/或将 bean 放在视图范围内。

  2. 您的 HTML 输出在语法上是无效的,因此会混淆负责更新 HTML DOM 树的 JavaScript 代码。您不应该在包含文件中使用<html>和。<h:body>它将在 HTML 输出中重复。您应该只在母版页中使用它。包含页面应如下所示:

    <ui:composition 
        xmlns="http://www.w3.org/1999/xhtml"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:ui="http://java.sun.com/jsf/facelets">
        <h:panelGrid columns="4" border="0" width="90%">
            ...
        </h:panelGrid>
    </ui:composition>
    

    不要复制<html>,<h:head>和/或<h:body>在那里。

于 2011-10-10T18:18:41.377 回答