[英]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.