2012-12-03 30 views
0

我有一個「渲染」的commandLink,它是根據@RequestScoped bean中的值計算出來的。 commandLink使用f:ajax來調用一個監聽器,但似乎該方法從未被執行。f:由於渲染=「false」,ajax監聽器沒有執行?

事實證明,如果我設置了渲染=「#{true}」或完全沒有渲染屬性,那麼偵聽器將被正確執行。這是否有可能是因爲呈現是基於請求範圍的值,而這些值在ajax回發時不再存在(並因此導致「false」),而偵聽器正在被跳過?請注意,f:ajax還會執行一些執行成功的執行操作。

+1

相關:http://stackoverflow.com/questions/2118656/hcommandlink-hcommandbutton-is-not-being-invoked/2120183#2120183(點5) – BalusC

回答

2

您不應該使用請求作用域bean來定義任何UI組件的呈現屬性的值。除非你特別小心,否則原始bean將被銷燬而失去它的價值,而創建一個新的bean會隨着每個請求而改變。因此,對於下一個請求,組件將被隱藏,因爲呈現的屬性值很可能未被評估爲真。

您應該使用視圖範圍代替您的bean。看一個例子here,但你應該很容易找到其他的例子搜索像'jsf rendered attribute request scope bean'

+0

事情是,當執行回發沒有什麼是重新提交,所以一會假設「呈現」屬性在那一點上沒有任何影響。但它顯然是爲了傾聽者執行,儘管不是爲了提交價值。這對我來說似乎很奇怪。 – nablex

+0

這種行爲真的很奇怪,並且不直觀,我有很糟糕的經歷,並且不能全面地理解它。恕我直言,這是非常糟糕的,我甚至沒有看到這個'功能'的任何合法用法。我認爲使用帶有渲染的請求範圍應該立即爲整個頁面引發「編譯」錯誤,類似於EL表達式中的語法錯誤。作爲一種解決方案,我使用'永不使用請求範圍'的口頭禪,它有效地讓我擺脫困境。也許@BalusC應該解釋原因或在此添加更好的鏈接。 –