Как собрать значения компонента UIInput внутри компонента UIData в методе действия bean-компонента?
Я пытаюсь собрать значения UIInput
компонент внутри UIData
компонент во время метода действия bean-компонента для проверки дублированных значений. Я пытался связать UIInput
компонент к свойству бина и получает его значение, но он печатает null
, Если я размещу его вне таблицы данных, то он напечатает ожидаемое значение. Что-то не так с датируемым?
<rich:dataTable binding="#{bean.table}" value="#{bean.data}" var="item">
<h:column>
<f:facet name="header">
<h:outputText value="Field1" />
</f:facet>
<h:inputText binding="#{bean.input}" value="#{item.field1}" />
</h:column>
</rich:dataTable>
Вот код поддержки бина:
private UIData table;
private UIInput input;
public void save() {
System.out.println(input.getId() + " - " + input.getValue());
}
1 ответ
Нет ничего плохого в данных. Там только один UIInput
компонент в дереве компонентов JSF, состояние которого изменяется каждый раз, когда родитель UIData
Компонент перебирает каждый элемент модели. Таким образом, состояние доступно только во время UIData
итерация, а не до или после. Вы пытаетесь получить доступ к значению одного компонента в методе действия компонента, в то время как родитель UIData
компонент не перебирает его, поэтому значения всегда будут возвращаться null
,
Вам нужно посетить дерево компонентов UIComponent#visitTree()
на UIData
и собирать информацию, представляющую интерес в VisitCallback
реализация.
table.visitTree(VisitContext.createVisitContext(FacesContext.getCurrentInstance()), new VisitCallback() {
@Override
public VisitResult visit(VisitContext context, UIComponent target) {
if (target instanceof UIInput) {
UIInput input = (UIInput) target;
System.out.println("id: " + input.getId());
System.out.println("value: " + input.getValue());
}
return VisitResult.ACCEPT;
}
});
Кстати, вы обычно выполняете проверку с нормальным Validator
на UIInput
компонент или, в данном конкретном случае, может быть, лучше, ValueChangeListener
, Это позволяет легче делать недействительными и обрабатывать сообщения.