2012-01-04 63 views
5

我正在使用Primefaces嚮導組件。在一個標籤上,我基於之前的標籤輸入(用戶類型)動態創建輸入框。輸入框文本標籤是從列表派生而來的。在我的支持bean中,我有一個包含作爲鍵的輸入標籤和作爲值的輸入框輸入的映射。如何使用嚮導將輸入框值綁定到支持bean屬性中的映射值

點擊未來,我想(對應鍵)地圖(值)與用戶輸入更新

<c:forEach items="#{gdsiGeodataBean.actionCommand.fields}" var="reqs"> 
    <h:outputLabel for="#{reqs.name}" value="#{reqs.name}:* " /> 
    <pou:inputText value="#{gdsiGeodataBean.actionCommand.values['reqs.name']}" required="true" requiredMessage="Input is required."/> 
</c:forEach> 

我支持bean:

private List<RequiredParam> fields; // +getter (no setter required) 
private Map<String, String> values; // +getter (no setter required) 

public CommandAction(String actionName, String actionParams, String context) { 
    this.actionName = actionName; 
    this.actionParams = actionParams; 
    this.contextName = context; 

    //Set up parameters 
    getRequiredParams(); 
    getOptionalParams(); 
    fields = getFields(); 
    values = new HashMap<String, String>(); 
} 

本質上講我想要的是用來自文本輸入框的用戶輸入來更新地圖值。

+0

正如你所看到的,我正在關注這個示例http://stackoverflow.com/questions/7010256/how-to-dynamically-build-a-back-bean-edit-form – algone 2012-01-04 11:44:29

+0

嘗試添加一個FlowListener事件在你的託管bean上,並在那裏驗證你的映射中的值是否在服務器端進行了更新:'flowListener =「#{managedBean.onFlowListener}'。 如果沒有發生這種情況,請驗證你沒有收到任何異常或驗證錯誤在回發驗證階段。 – 2012-01-04 12:35:06

+0

@maple_shaft我已經在我的視圖中。 algone 2012-01-04 13:49:02

回答

12

將輸入值綁定到地圖的方法並不完全正確。

<pou:inputText value="#{gdsiGeodataBean.actionCommand.values['reqs.name']}" required="true" requiredMessage="Input is required."/> 

你指定固定地圖的關鍵,而不是基於當前迭代#{reqs}動態地圖鍵。通過這種方式,所有提交的值將以同一個固定映射關鍵碼"reqs.name"結束,從而每個參數都相互覆蓋,以便只獲取地圖中最後一個字段的值。

您需要刪除這些單引號以使其成爲真正動態的關鍵。

<pou:inputText value="#{gdsiGeodataBean.actionCommand.values[reqs.name]}" required="true" requiredMessage="Input is required."/> 

無關的具體問題,即使使用,是你的問題時,這種做法將工作,<c:forEach>會在某些情況下會失敗。例如。在複合組件或迭代JSF組件中使用時。改爲使用<ui:repeat>。另請參閱JSTL in JSF2 Facelets... makes sense?

+1

'actionCommand.values'不需要一個getter和setter來真正成爲一個綁定的屬性嗎? OP沒有在他的代碼中顯示,但我問,因爲我真的不知道,我從來沒有使用'c:forEach'組件。 – 2012-01-06 12:56:08

+2

@maple_shaft:只需要一個gettervalue()''。地圖/列表中不需要二維碼。 JSF EL將通過EL給定鍵/索引來設置獲取的地圖/列表上的值。像這樣:'gdsiGeodataBean.getActionCommand()。getValues()。put(reqs.getName(),newValue)''。這是不管它在'',''等內部。 – BalusC 2012-01-06 12:59:23

+0

謝謝你的解釋,現在有道理! – 2012-01-06 13:10:24

相關問題