2015-08-21 93 views
1

爲了支持我們組織的組件庫,我想創建一個增強的selectManyMenu。一個要求是,它類似於具有下拉菜單的類型,其菜單項具有顯示是否被選中的複選框。最重要的是,我想要下拉的第一行,該區域總是可見的,以顯示缺少更好的術語的「泡泡」,其中包含所選項目的標籤以及「X」按鈕刪除每一個,類似於'標籤'小部件。JSF 2.2多選擇自定義組件

我想創建一個JSF自定義組件,而不是用現有的<h:selectManyMenu>來裝飾一些隱藏它的jQuery插件,並用一堆混淆的javascript呈現它自己的小部件,我不知道它是如何工作的。說實話,沒有一個我發現它與我們的用戶界面非常吻合,並且從根本上說,我並不認爲這很好地利用了JSF,當JSF擁有如此強大的自定義組件特性。

去我當前的問題,我已經建立了一個自定義組件類,它擴展UIInput,並提供encode*()方法來呈現一個<select><option>標籤相同的<h:selectManyMenu>一樣。我有一個問題與decode()方法:

@Override 
public void decode(FacesContext context) { 
    Map<String, String> requestParams = context.getExternalContext().getRequestParameterMap(); 
    String clientId = getClientId(); 
    Object param = requestParams.get(clientId); 
    LOG.debug("param: {}", param); 
} 

的問題是param結束是一個字符串,不管我有多少項目中進行選擇。我在前端驗證了使用<h:selectManyMenu>時發送的完全相同的POST請求,所以我猜測我必須在decode()中對請求中的所有值做不同的處理。

對於獎勵積分,任何人都可以指出我對源代碼的簡單解釋,比如說,即使只是<h:inputText>。我能夠瀏覽我們正在使用的JSF實現源代碼Mojarra,但由於它使用單獨的渲染器以及各種工廠和事物來選擇使用哪個渲染器等,所以它非常難以遵循。我已經獲得了到目前爲止,靠着複合材料部件,必要時還需要支撐部件,但是這一個和其他一些部件從管道下來,我認爲超出了可以有效使用的複合材料部件。

此外,這是最好的方法來完成我後?爲現有的<h:selectManyMenu>創建自定義渲染器會更好嗎?這似乎是一個更優雅的解決方案,因爲這個組件基本上是一個selectManyMenu,只是呈現有點不同,前端有一點javascript。

回答

1

我猜你的問題可以歸結爲:

我怎樣才能獲得與JSF多個值的請求參數?

答案是:使用ExternalContext#getRequestParameterValuesMap()

@Override 
public void decode(FacesContext context) { 
    Map<String, String[]> requestParamValues = context.getExternalContext().getRequestParameterValuesMap(); 
    String clientId = getClientId(context); 
    String[] params = requestParamValues.get(clientId); 
    // ... 
} 

但它變得非常難以遵循,因爲它使用獨立的渲染器,以及工廠和事物的種種選擇要使用的渲染器等

不知道,但也許你正在尋找What is the relationship between component family, component type and renderer type?How do I determine the renderer of a built-in component

我會更好地爲現有的<h:selectManyMenu>創建自定義渲染器嗎?這似乎是一個更優雅的解決方案,因爲這個組件基本上是一個selectManyMenu,只是呈現有點不同,前端有一點javascript。

確實更有意義。

+0

感謝BalusC,這兩個鏈接包含了很多我缺少的信息。我還發現http://omnifaces-fans.blogspot.ro/2014/11/omnifaces-component-family-component.html對組織我的組件庫非常有幫助。 – Matt

+0

不客氣。 – BalusC