2011-10-10 20 views
0

我們有一個列表顯示在屏幕的一個面板中,其中字段可重複的所有代碼都保存在不同的Facelet文件下。當我試圖根據ajax事件的偵聽器動作呈現圖像時,由於使用<ui:repeat>(如repeatForm:repeat:2:redimage),由於JSF正在生成索引在中間的ID,所以我得到一些更新帶有ID的圖像的問題。ui:repeat + AJAX

這是主頁:

<!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的內容。

我們正在調用監聽器中的方法,並將布爾指示符的值設置爲truefalse,默認爲false。指示器用於渲染圖像。

但是,當我們使用這個<f:ajax>呈現基於該指標值的形象,我收到錯誤

malformedXML:在更新repeatForm:重複:2:redimage沒有找到

這是如何造成的,我該如何解決這個問題?

回答

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>

+0

我在製作bean時遇到問題ScopeType.PAGE ...有沒有辦法做ui:重複使用ScopeType.SESSION? – efirat

+0

嗯,我是usinf Seam框架。當我讀到它時,ui:repeater和AJAX一起只能在VIEW範圍內工作。但是,我無法將範圍SESSION更改爲VIEW ...所以,primefaces組件ajax行爲不起作用。我會問一個新問題。謝謝 – efirat

相關問題