5

私の問題は、データテーブルの列にデフォルトで出力テキストを表示させ、コマンドボタンが押されたときにそれを入力テキストに置き換えようとしていることです。解決策が見つかりませんでした。ちなみに初投稿。

dataTable のこの部分を再レンダリングしようとしている a4j:commandButton があります。

<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;
}

どんな助けでも大歓迎です。

4

1 に答える 1

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 を使用すると、outputPanelajaxRendered="true"全体が更新されるため、ajax の更新により、そのコンポーネント全体が更新され、その中にネストされたものはすべて更新されます。

于 2012-11-10T18:44:34.113 に答える