2014-06-27 19 views
1

我已經看到了BalusC的答案和改變範圍的解決方案,但是我嘗試了它,並且我認爲還有另外一個似乎不能用JSF2解決的問題。h:commandButton在嵌套到自己的組件中時不會被調用擴展UIData

我已經創建了一個擴展UIData的自定義組件。這個自定義組件顯示一個包含數據行的表,它被稱爲PagingDataTable。它包含PagingDataColumns,然後可以點擊和排序順序改變等...

這工作正常,但只要我在PagingDataColum中添加一個h:CommandButton,該按鈕的操作不會被調用。讓我來解釋這一點:

  • 使用嵌套f出現它的工作原理:AJAX元素
  • 但當剛剛確定在H的動作它不工作:命令按鈕沒有嵌套

在這個特殊的我不想爲它使用Ajax。我調試了它,發現ButtonRenderer類的Mojarra實現中存在不匹配(方法wasClicked)。在這個方法內部,檢查按鈕是否被點擊,並且根據ID(實際名稱,但是這是ID)完成此檢查。但是UIData組件具有兩個不同的ID:

  • 當rowIndex存在時(例如,同時在rowIndex不存在時呈現
  • 沒有rowIndex的ID,例如,當用戶點擊按鈕

因此,wasClicked()試圖在參數映射中找到沒有rowIndex的ID而無效,因此,不會調用操作方法。

恕我直言,這是ButtonRenderer.wasClicked()方法中的一個錯誤,它需要額外的邏輯才能理解沒有rowId的ID在帶有rowId的ID的參數映射中不完全匹配。

我在這裏錯過了什麼嗎?恕我直言,這與底層數據的範圍無關,因爲rowId在任何情況下都不存在,與範圍無關。但我用SessionScoped試過了,同樣的事情正在發生。

我也下載Mojarra 2.1.28版本:同樣的事情正在發生。 Mojarra 2.2.X似乎不能用我的Glasssfish服務器版本輕鬆工作,所以我無法用最新版本試用它。我有點困在這裏,實際上用例很簡單:在pagingDataTable的任意一列添加一個按鈕,並讓它調用一個動作。

可以通過使用Ajax或通過自己做一些JS編碼來爲此做一個解決方法......但是在JSF2中這不應該是必需的嗎?任何幫助表示讚賞。

回答

0

好的,很抱歉提出這個問題。 看來,加入

<f:param name="cid" value="#{javax.enterprise.context.conversation.id}" /> 

嵌套在H時:的commandButton,它將(神奇)設置的rowIndex被點擊該行,並在ButtonRenderer邏輯重新工作。一切順利,然後。

相關問題