a4j:commandButton reRendering rich:datatable

Tay*_*lik 5 jsf richfaces richdatatable rerender jsf-1.2

我的问题是我试图在我的数据表中显示一个默认的输出文本列,并在按下命令按钮时用输入文本替换它.还没有找到解决方案.顺便提一句.

我有一个a4j:commandButton,我正在寻找reRender我的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>
Run Code Online (Sandbox Code Playgroud)

我想激活这个方法(只显示相关代码)

@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;
}
Run Code Online (Sandbox Code Playgroud)

任何帮助非常感谢.

kol*_*sus 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>
Run Code Online (Sandbox Code Playgroud)

ajax刷新工作的方式是使用javascript在DOM树中定位clientId以使用新标记进行更新,即组件必须已经在DOM树中.由于您已经设置了rendered="false",因此该组件永远不会在DOM树中开始.所以在ajax请求中,浏览器不知道你在说什么,因为它找不到要更新的clientId.

使用outputPanel ajaxRendered="true",您将刷新整个outputPanel,因此ajax刷新将整个更新该组件,无论您嵌入其中的是什么