a4j:commandButton reRendering rich: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;
}

Любая помощь высоко ценится.

1 ответ

Решение

Вы должны обернуть оба компонента в <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, чтобы найти clientId в дереве DOM для обновления с новой разметкой, т.е. компонент уже должен быть в дереве DOM. Так как вы установили rendered="false"компонент никогда не входил в дерево DOM. Таким образом, по запросу ajax браузер не знает, о чем вы, потому что не может найти clientId для обновления.

Использование outputPanel с ajaxRendered="true"вы обновляете всю выходную панель, поэтому обновление ajax обновит этот компонент в целом, независимо от того, что вы в него вложили

Другие вопросы по тегам