2013-01-09 104 views
0

林我嘗試了一下使用JSF,方案如下:變化呈現屬性

我有一個會話範圍的託管bean

@ManagedBean(name = "rand") 
@SessionScoped 

在那裏我已經聲明如下(其他中事情):

private UIOutput uiOutput;(plus getter and setter) 

在我的Facelets頁面,我有

<h:outputLabel for="userGuess" binding="#{rand.uiOutput}" 
value="#{rand.listSize}" rendered="false"/> 

還有就是對網頁上的按鈕,並在除其他事項外的按鈕的操作方法,我有

this.uiOutput.setRendered(true); 

但它似乎沒有工作,該元素將不會被渲染。

如果以渲染方式啓動它並更改屬性(將其設置爲true或false),它將起作用。 我懷疑它與這個事實有關,起始爲未呈現的元素未綁定到我的託管bean中的uiOutput對象。我如何使它在這種情況下工作?

+2

這將是更好的綁定到一個bean屬性︰'rendered =「#{rand.someBoolean}」' – McDowell

+0

我完全同意,並已測試,它的工作原理,我只是試驗綁定到一個組件,而不是到一個價值。 – B11

+0

okie毫無疑問問題很好解釋。但我想知道你想要檢查「我們如何使用託管bean呈現」或「UIOutput的功能」? – Freak

回答

1

有一件事我改變,現在它是工作,我改變了我運行按下按鈕時,它返回一個字符串值,現在導航到同一個頁面,它的方法的返回類型返回null並且JSF不會生成新視圖,而是呈現相同的視圖,並且所有視圖都在工作。

我猜是因爲每次渲染值爲true或false時,都會呈現新視圖,因爲每次在新視圖上將組件設置爲呈現=「false」。

+1

它現在的作品,因爲你的命令按鈕觸發一個完整的頁面刷新,並在構建DOM時考慮到'render'的新值樹 – kolossus

+0

在java ee教程中,我看到: 將組件的呈現屬性設置爲true後,此方法返回邏輯 結果爲空。這會導致JavaServer Faces實現重新渲染頁面,而不會創建頁面的新視圖,從而保留客戶的輸入。所以我的理解是它保持相同的對象,並簡單地更新該設置。它是否正確? – B11

+0

是的,但可能不是你的想法。它不會創建一個新的視圖,因爲viewId仍然保留在用戶會話中,但是**,整個DOM樹(標記和全部)是使用來自服務器端的更新指令重建的 – kolossus

0

如果您正在使用按鈕進行ajax調用,那麼javascript無法在dom樹中找到您的元素來呈現它,因爲它不在第一處。

這裏有一個類似的問題,它更好地解釋了情況。

Render component with ajax in jsf

+0

嗨,我沒有使用ajax調用,代碼如上 – B11