2011-10-03 57 views
2

我有一個簡單的頁面,我使用<ui:repeat>,它從後臺bean獲取值。JSF UIRepeat和PostBack

最初的請求會給它一個空的列表。然後回發將調用一個動作,它會改變<ui:repeat>後面的模型,但它不會被渲染?!

我調試通過它,我看到<ui:repeat>評估恢復查看階段的值,但多數民衆贊成在它。當它達到渲染響應時,它不會使用我的bean的最新值。這是預期的行爲?

我該如何做這項工作?我是否必須編寫自己的重複標籤?

+0

這應該工作正常,請包括最小的xhtml來演示此行爲。 – mrembisz

+0

@mrembisz我無法以某種方式重現該錯誤。這真的很平坦,只有當會話是新的時纔會發生?我在IBM上...我會嘗試一下,但你能告訴我什麼嗎? –

+0

ui:當它嵌套兩次或更多次時,重複可能會出現奇怪現象。它帶有自己的狀態管理,我認爲它對於更復雜的應用程序並不完全可靠。當它沒有嵌套時,它應該可以預測。 – mrembisz

回答

0

我真的不能告訴可能是什麼問題,而你的一些代碼,但這些都是基本知識:

支持bean:

public class ObjectService{ 

private DataModel objectDataModel; 
private List<Object> objectList; 
private Pagination paginationHelper; 
private ObjectDao objectDao = new ObjectDao(); 
private String queryOption; 

public void setQueryOption(String queryOption){ 
    this.queryOption = queryOption; 
} 

public String getQueryOption(){ 
    return this.queryOption; 
} 

public <E> PaginationHelper getPagination(final List<E> list) { 
    pagination = new PaginationHelper(10) { 

     @Override 
     public int getItemsCount() { 
      return list.size(); 
     } 

     @Override 
     public DataModel createPageDataModel() { 
      return new ListDataModel(list); 
     } 
    }; 

    return pagination; 
} 

public void setPagination(PaginationHelper pagination) { 
    this.pagination = pagination; 
} 

public List<Object> getObjectList(){ 
    this.objectList = objectDao.readObjectsWhere(queryOption); 

    return this.objectList; 
} 

public void setObjectList(List<Object> objectList){ 
    this.objectList = objectList; 
} 

public DataModel getObjectDataModel(){ 
    if (objectDataModel == null) { 
     objectDataModel = getPagination(getObjectList()).createPageDataModel(); 
    } 

    return objectDataModel; 
} 

public void setObjectDataModel(DataModel objectDataModel){ 
    this.objectDataModel = objectDataModel 
} 

public String changeModel(){ 
    objectDataModel = null;  
    return null; 
} 

} 

XHTML頁面:

... 
<h:form> 


    <fieldset>     
     <label> 
     <span>Option:</span> 
     <h:inputText value="#{objectService.queryOption}" /> 
     </label> 

     <h:commandButton action="#{objectService.changeModel}" value="request data" /> 
    </fieldset> 

    <ui:repeat value="#{objectService.objectDataModel}" var="objectVar"> 

     <h:outputLabel value="#{objectVar.property1}" /> 
     <h:outputLabel value="#{objectVar.property2}" /> 
     <h:outputLabel value="#{objectVar.property3}" /> 

    </ui:repeat> 

</h:form> 
...