2012-11-10 10 views
5

Mój problem polega na tym, że próbuję domyślnie umieścić w moim programie datatable kolumnę wyjściową i zastąpić ją tekstem wejściowym po naciśnięciu klawisza polecenia. Nie znalazłem rozwiązania. Pierwszy post przy okazji.a4j: commandRuttering rich: datatable

Mam a4j: CommandButton że szukam reRender tę część mojego 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> 

I chciałbym aktywować tę metodę (tylko pokazuje odpowiedni kod)

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

Każda pomoc bardzo doceniane.

Odpowiedz

5

Musisz zawinąć oba komponenty w <a4j:outputPanel id="myPanel" ajaxRendered="true"/>. Powodem, dla którego oba komponenty nie są ponownie wysyłane, jest to, że komponent ustawiony na rendered="false" nie zostanie wysłany do przeglądarki podczas renderowania początkowego widoku.

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

Sposób ajax odświeża pracę jest za pomocą javascript, aby zlokalizować ClientID w drzewie DOM zaktualizować nowe znaczniki, czyli składnik musi być już w drzewie DOM. Ponieważ ustawiłeś rendered="false", komponent nigdy nie był w drzewie DOM. Więc na żądanie ajax, przeglądarka nie wie, o czym mówisz, ponieważ nie może znaleźć ID klienta do aktualizacji.

Używanie outputPanel z ajaxRendered="true", jesteś orzeźwiający całą outputPanel, więc odświeżanie ajax zaktualizuje ten składnik jako całość, z tym, co już zagnieżdżony w niej

+1

W tym przypadku, ' 'działałby jako UIContainer, więc ponowne renderowanie tabeli danych pokaże/ukryje odpowiednio' '/' '. Wygląda na to, że OP nie poradzi sobie z konwersacją scopde dla tej sprawy. –