2017-11-18 2 views
0

Ich versuche, eine Facette in meiner .xhtml-Datei programmatisch zu ändern. Ich benutze Primefaces 6.1.JSF kann Facette nicht ändern

Ich habe den folgenden Code in .xhtml

<p:menubar model="#{menu.model}" id="myMenu"> 
    <f:facet name="options"> 

    </f:facet> 
</p:menubar> 

In meiner Bohne habe ich den folgenden Code "Optionen" Facette zu aktualisieren.

@PostConstruct 
public void initMenu(){  
// getting data is skipped 
    HtmlPanelGrid mainPanel = new HtmlPanelGrid(); 
    HtmlOutputLabel htmlOutputLabel = new HtmlOutputLabel(); 
    htmlOutputLabel.setValue("Search Template"); 
    mainPanel.getFacets().put("options",htmlOutputLabel);  
} 

mainPanel.getFacets() gibt daher keine Facetten dieses Etikett nicht hinzufügen können.

Wie kann ich programmatisch auf die Facette zugreifen und sie ändern? Ich bin ratlos.

+0

Warum sollte ein neu (in falscher weise btw) erstellt ** panelgrid ** die Facetten einer nicht verwandten Menüleiste ??? – Kukeltje

Antwort

0

Um getFacets() von menubar müssen Sie Bezug auf Instanz der bestehenden menubar erhalten.

Sie können dies erreichen, indem Sie p:menubar an die serverseitige Komponenteninstanz binden.

  1. In Ihrem Managed Bean
  2. hinzufügen

private org.primefaces.component.menubar.Menubar menubar;

und Getter und Setter hinzufügen.

  1. hinzufügen binding Attribut p:menubar wie diese

    <p:menubar model="#{menu.model}" id="myMenu" binding="#{menu.menubar}"> 
        <f:facet name="options"> 
    
        </f:facet> 
    </p:menubar> 
    
  2. Innen @PostConstruct Methode

    @PostConstruct 
    public void initMenu() { 
        // getting data is skipped 
        //initMenuModel(); 
    
        menubar=(Menubar)FacesContext.getCurrentInstance().getApplication().createComponent(Menubar.COMPONENT_TYPE); 
        HtmlOutputText htmlOutputLabel = new HtmlOutputText(); 
        htmlOutputLabel.setValue("Search Template"); 
        Map<String, UIComponent> facets = menubar.getFacets(); 
        facets.put("options", htmlOutputLabel); 
    } 
    

auch Empfehlungen hinzufügen prüfen und Best Practices in Bezug auf JSF 'binding' attribute.

+0

Danke für den Versuch zu antworten. Sicher funktioniert das also mit dem deklarativ hinzugefügten menumodel? Und es ist nicht gut, Komponenten über "neu" zu erstellen. – Kukeltje

+0

Ich habe diese Lösung mit einem Fall getestet, den der Benutzer gepostet hat (kein deklaratives Datenmodell). Ich stimme seiner nicht Best Practice zu, aber ich denke, dass es in diesem Fall keinen Schaden gibt. –

+0

Sorry, ich meinte, der Verweis auf das menuModel wurde über ein Attribut deklariert, keine deklarative Menüstruktur. OP hat das in seiner Frage. – Kukeltje