2010-11-29 7 views
3

Was ich möchte, einfach zu tun, zu erklären ist:JSF - Erstellen Sie ein dynamisches Menü mithilfe von AJAX & selectOneListbox

bean

@ManagedBean 
@ViewScoped 
public class Articles { 
    private String selectedMenu; 

    @PostConstruct 
    public void init() { 
     if(selectedMenu==null || selectedMenu.trim().isEmpty()) { 
      this.selectedMenu="0"; 
     } 
    } 

    public String getSelectedMenu() { return selectedMenu; } 
    public void setSelectedMenu(String selectedMenu) { this.selectedMenu = selectedMenu; } 
} 

page

<h:selectOneListbox onchange="..?? ajax call that render on loadMenu and pass the value of the focused listbox to Articles Bean" id="category" size="0" > 
    <f:selectItem itemLabel="first" itemValue="0" /> 
    <f:selectItem itemLabel="second" itemValue="1" /> 
    <f:selectItem itemLabel="third" itemValue="2" /> 
</h:selectOneListbox> 

<h:panelGroup layout="block" id="loadMenu"> 
    <h:panelGroup rendered="#{articles.selectedMenu=='0'}"> 
     MENU 0 
    </h:panelGroup> 

    <h:panelGroup rendered="#{articles.selectedMenu=='1'}"> 
     MENU 1 
    </h:panelGroup> 

    <h:panelGroup rendered="#{articles.selectedMenu=='2'}"> 
     MENU 2 
    </h:panelGroup> 
</h:panelGroup> 

Wenn ich ändern die Wert der Listbox, sollte sich das Menü dynamisch ändern (durch Aufruf einer Funktion auf dem Server). Ich denke, dass der obige Code das ausdrückt, wonach ich suche.

Ich muss wissen, wie es mit der Option onchange aufrufen. Ist es möglich?

Prost

UPDATE

<h:panelGroup layout="block"> 
    <h:selectOneListbox styleClass="article_combo" size="0" id="selectedMenu" > 
     <f:selectItem itemLabel="first" itemValue="0" /> 
     <f:selectItem itemLabel="second" itemValue="1" /> 
     <f:selectItem itemLabel="third" itemValue="2" /> 

     <f:ajax event="change" execute="@this" render="loadMenu" /> 
    </h:selectOneListbox> 
</h:panelGroup> 

<h:panelGroup layout="block" id="loadMenu"> 
    <h:panelGroup rendered="#{articles.selectedMenu=='0'}"> 
     MENU 0 
    </h:panelGroup> 

    <h:panelGroup rendered="#{articles.selectedMenu=='1'}"> 
     MENU 1 
    </h:panelGroup> 

    <h:panelGroup rendered="#{articles.selectedMenu=='2'}"> 
     MENU 2 
    </h:panelGroup> 
</h:panelGroup>  

Antwort

3

Sie können die Ajax-Unterstützung in 2 bis JSF gebaut, um dies zu erreichen. Fügen Sie dazu ein f: ajax-Tag in Ihr h: selectOneListbox-Tag ein. Die f: ajax-Tag sollte wie folgt aussehen:

<f:ajax render="loadMenu" execute="@this" /> 

Dies sollte den geänderten Wert im Listenfeld und wieder machen die panelGroup verarbeiten.

Weitere Einzelheiten finden Sie unter: http://mkblog.exadel.com/2010/04/learning-jsf-2-ajax-in-jsf-using-fajax-tag/

+0

Ja, dies sollte funktioniert. Aber ich muss das tun, wenn ich das fokussierte Element ändere. Wie "mach es auf onchange" :) – markzzz

+1

Add 'event =" ändern "'. Es ist jedoch bereits das Standardereignis für 'h: selectOneMenu'. Hast du es trotzdem versucht? Genau diese Linie, wie von Brian vorgeschlagen, sollte schon ausreichen. – BalusC

+1

Wie BalusC gezeigt hat, können Sie das Ereignisattribut angeben, auf dem das Ajax-Ereignis ausgelöst wird, wobei das Ereignis das DOM-Ereignis ist. Das Standardereignis für eine Listbox ist "ändern". Weitere Details finden Sie in der JSF2-API: http: //download.oracle.com/docs/cd/E17802_01/j2ee/javaee/javaserverfaces/2.0/docs/pdldocs/facelets/f/ajax.html –

Verwandte Themen