2012-11-10 29 views
5

我的問題是,我試圖讓我的數據表中的列默認情況下顯示outputtext,並在按下commandbutton時用inputtext替換它。還沒有找到解決方案。順便提一下第一篇文章。a4j:commandButton reRendering rich:datatable

我有一個A4J:的commandButton,我希望重新描繪我的dataTable

<a4j:commandButton reRender="yieldTable" action="#{yieldSearch.activateVisible()}" 
id="modify" styleClass="editLargeIcon" value="Modify"> 
</a4j:commandButton> 

<rich:dataTable id="yieldTable" value="#{yieldSearch.yfitem.yielditem}" var="_yield"> 
<rich:column> 
<f:facet name="header">%-YLD</f:facet> 
<h:outputText value="#{_yield.yfYield}" rendered="#{not yieldSearch.visible}"> 
</h:outputText> 
<h:inputText rendered="#{yieldSearch.visible}" /> 
</rich:column> 

這一部分,我想激活此方法(只顯示相關代碼)

@Name("yieldSearch") 
@Scope(ScopeType.CONVERSATION) 
public class YieldSearch implements Serializable{ 

private Boolean visible; 

public void activateVisible(){ 
    this.setVisible(true); 
    System.out.print(true); 
} 

    public void setVisible(Boolean visible) { 
    this.visible = visible; 
} 

public Boolean getVisible() { 
    return visible; 
} 

任何幫助非常感激。

回答

5

您需要將兩個組件都包裝在<a4j:outputPanel id="myPanel" ajaxRendered="true"/>中。這兩個組件無法重新生成的原因是,您設置爲rendered="false"的組件將不會在初始視圖呈現中發送到瀏覽器。

<a4j:outputPanel id="myPanel" ajaxRendered="true"> 
<h:outputText value="#{_yield.yfYield}" rendered="#{not yieldSearch.visible}"/> 
<h:inputText rendered="#{yieldSearch.visible}" /> 
</a4j:outputPanel> 

AJAX刷新工作的方法是使用JavaScript來定位DOM樹一個clientId新的標記來更新,即組件必須已經在DOM樹。由於您已設置rendered="false",因此該組件從未在DOM樹中開始。所以在ajax請求中,瀏覽器不知道你在說什麼,因爲它找不到要更新的clientId。

使用outputPanel與ajaxRendered="true",你刷新整個outputPanel,所以阿賈克斯刷新將更新組件作爲一個整體,不管你已經嵌套在

+1

在這種情況下,'<豐富: dataTable>將充當UIContainer,因此重新渲染數據表將相應地顯示/隱藏''/''。它看起來像OP無法處理這種情況下的對話scopde。 –