UI: повторить + AJAX - PullRequest
       44

UI: повторить + AJAX

0 голосов
/ 10 октября 2011

У нас есть список, который будет отображаться под панелью экрана, где весь код, в котором повторяются поля, хранятся в другом файле Facelet. Хотя я пытаюсь визуализировать изображение на основе действия слушателя для события ajax, у меня возникает проблема с обновлением изображения с помощью идентификатора, поскольку JSF генерирует идентификатор с индексом в середине из-за использования <ui:repeat>, например, так 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>, которые выглядят так: repeatForm:repeat:2:redimage. Но поскольку мы используем тег <f:ajax>, нам нужно только указать "redimage". Тег заботится о поиске действительного идентификатора.

Мы вызываем метод в слушателе и устанавливаем значение логического индикатора либо true, либо false, что по умолчанию равно false. Индикатор используется для визуализации изображения.

Но когда мы используем это <f:ajax> для рендеринга изображения на основе значения индикатора, я получаю ошибку

malformedXML: во время обновления repeatForm: repeat: 2: повторное изображение не найдено

Как это вызвано и как я могу это решить?

1 Ответ

1 голос
/ 10 октября 2011

Это должно работать. Я вижу только 2 возможных причины:

  1. Ваш бин имеет объем запроса и не сохраняет значение <ui:repeat>. Исправьте работу конструктора бина и / или поместите бин в область видимости.

  2. Ваш вывод HTML синтаксически неверен и поэтому вводит в заблуждение код JavaScript, который отвечает за обновление дерева HTML DOM. Вы не должны использовать <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> там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...