Как связать значения поля ввода со значением карты в свойстве базового компонента при использовании мастера - PullRequest
5 голосов
/ 04 января 2012

Я использую компонент мастера Primefaces. На одной вкладке я динамически создаю поля ввода на основе ввода предыдущих вкладок (тип пользователя). Текстовые метки в поле ввода выводятся из списка. В моем компоненте поддержки есть карта, которая содержит метки ввода в качестве ключей и входные данные в качестве значений.

Нажав далее, я бы хотел, чтобы карта (значения) обновлялась с помощью пользовательского ввода (соответствующего клавиши)

<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>

Мой поддерживающий боб:

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>();
}

По сути, мне бы хотелось, чтобы значения карты обновлялись с помощью пользовательских вводов из полей ввода текста.

1 Ответ

12 голосов
/ 06 января 2012

Ваш подход для привязки входного значения к карте не совсем корректен.

<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 в JSF2 Facelets ... имеет смысл?

...