2012-11-10 15 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"に設定したコンポーネントが初期ビューレンダリングでブラウザに送信されないためです。 AJAXは、作業をリフレッシュ

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

方法、すなわち成分がすでにDOMツリー内にある必要があり、新たなマークアップで更新するDOMツリー内のclientIdを検索するためにJavaScriptを使用することです。 rendered="false"を設定しているため、コンポーネントはDOMツリー内に決して配置されませんでした。したがって、ajaxリクエストでは、ブラウザは、更新するclientIdを見つけることができないため、あなたが話していることを知らない。 Ajaxのリフレッシュは、あなたがこのケースで

+1

内にネストされてきたものは何でもして、全体としてそのコンポーネントを更新しますのでajaxRendered="true"でoutputPanelを使用して

は、あなたは、全体outputPanelをリフレッシュしている、 '豊富な<: dataTable>はUIContainerとして動作するので、データテーブルをレンダリングすると '// ''が表示/非表示になります。 OPがこのケースの会話スコープを処理できないようです。 –

関連する問題