2017-11-18 160 views
0

我試圖以編程方式修改我的.xhtml文件中的構面。我正在使用Primefaces 6.1。JSF無法修改構面

我有.xhtml

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

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

下面的代碼在我的豆,我有以下的代碼來更新「選項」方面。

@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()返回no facets,因此不能添加標籤。

如何以編程方式訪問和修改構面?我很難過。

+0

爲什麼要新(以錯誤的方式順便說一句)創建** panelgrid **返回非相關菜單欄的方面? – Kukeltje

回答

0

要從到getFacets()您需要獲取現有menubar實例的參考。

您可以通過將p:menubar綁定到服務器端組件實例來實現此目的。

  1. 在你管理的bean添加

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

,並添加getter和setter。

  • 添加binding屬性p:menubar這樣

    <p:menubar model="#{menu.model}" id="myMenu" binding="#{menu.menubar}"> 
        <f:facet name="options"> 
    
        </f:facet> 
    </p:menubar> 
    
  • 內部@PostConstruct方法添加

    @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); 
    } 
    
  • 同時檢查建議和最佳實踐關於JSF 'binding' attribute

    +0

    謝謝你試圖回答。當然,這與聲明性添加的menumodel一起工作?通過「新」創建組件並不是一個好習慣。 – Kukeltje

    +0

    我已經用用戶發佈的案例(沒有聲明數據模型)測試過這個解決方案。我同意它不是最佳做法,但我認爲在這種情況下沒有任何傷害。 –

    +0

    對不起,我的意思是對menuModel的引用是通過屬性聲明的,而不是聲明性的菜單結構。 OP在他的問題中有這個。 – Kukeltje