簡體   English   中英

帶有ui:define的JSF2.0部分渲染

[英]JSF2.0 Partial Render with ui:define

我正在使用facelet模板,並且我認為ui:define和JSF生命周期遇到了問題。 我的template.xhtml在標題中包含一個固定菜單,簡化了它具有如下鏈接:

<h:commandLink value="Click Me">
    <f:ajax update="#{myBean.listener}" render="contentpanel"/>
</h:commandLink>

template.xhtml還包含ui:insert語句:

<ui:insert name="content">
    <h:outputLabel value="content placeholder"/>
</ui:insert>

現在我有一個content.xhtml看起來像:

<ui:composition template="template.xhtml">
    <ui:define name="content">
        <h:panelGroup id="contentpanel"/>
    </ui:define>
</ui:composition>

這么多的介紹。 當我單擊命令鏈接“ Click Me”時,我正在呼叫我的監聽器。 該偵聽器在backingbean中設置一個引用,以根據我單擊的鏈接動態加載內容。

第一次按下命令鏈接時,不會完成此渲染。 好吧,基本上看起來像是先進行重新渲染,然后再調用偵聽器,而不是相反。 因此,當我第一次單擊時,似乎什么都沒有發生。 當我第二次單擊時,會看到為第一次單擊設置的內容。 當我第三次單擊時,我看到第二次單擊的內容。

我認為這是因為ui:define視圖已經在JSF生命周期的“恢復視圖”階段中進行了重建。 關於如何克服這一點的任何想法?

UPDATE

似乎我的假設是錯誤的。 造成這種情況的原因似乎有所不同。 #{myBean.listener}具有一個@SessionScoped @ManagedProperty ,在單擊CommandLink之后會對其進行更新。 contentpanel實際上通過@RequestScoped#{myBean.data}加載數據。 #{myBean.data}無法正確重新加載數據。 我通過將getData()方法直接傳遞給@SessionScoped bean解決了它。

可能會有些混亂。 但是我的結論是:它確實可以部分渲染通過facelet模板加載的組件( ui:define / ui:insert

似乎我的假設是錯誤的。 造成這種情況的原因似乎有所不同。 #{myBean.listener}具有一個@SessionScoped @ManagedProperty,在單擊CommandLink之后會對其進行更新。 內容面板實際上是通過@RequestScoped的#{myBean.data}加載數據的。 #{myBean.data}無法正確重新加載數據。 我通過將getData()方法直接傳遞給@SessionScoped bean解決了它。

可能會有些混亂。 但是我的結論是:它確實可以部分渲染通過facelet模板加載的組件(ui:define / ui:insert)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM