Состояние визуализации SelectBooleanCheckbox не соответствует компоненту поддержки
Я использую JSF2.0 и собираю мастера. Я столкнулся с проблемой с SelectBooleanCheckboxes. Вот рабочий процесс:
- Загрузите страницу с флажками (значения привязаны к SortedMap в компоненте поддержки).
- Отметьте их и нажмите "Далее". Это увеличивает курсор, который страница использует, чтобы определить, какая группа Panel загружается.
- (Правильные) значения сохраняются в компоненте.
- Нажмите назад (курсор уменьшен), и страница отобразит редактируемые флажки. Первый флажок не отмечен (хотя связанная переменная содержит значение true для этого поля).
Этот подход на основе курсора (который содержит все экраны мастера), похоже, не работает. Однако, если я немного изменю это, чтобы кнопки "предыдущий / следующий" вызывали разные страницы HTML, эта проблема исчезла.
К сожалению, я не могу этого сделать. Мы собираемся подключить этот мастер в модальное диалоговое окно, поэтому посещение новой страницы в предыдущий / следующий не будет работать
Я написал небольшой пример этого (вместо того, чтобы просить вас пройтись по всему волшебнику).
Вот класс Java:
@ConversationScoped
@Named("hashBool")
public class HashBoolTest2 implements Serializable {
private static final long serialVersionUID = 1962031429874426411L;
@Inject private Conversation conversation;
private List<RestrictionItem> list;
private SortedMap<String, Boolean> values;
private int cursor;
public HashBoolTest2( ) {
List<String> none = new ArrayList<String>();
none.add("");
this.setList( new ArrayList< RestrictionItem >( ) );
this.getList().add( new RestrictionItem( "a", "a", none ) );
...
this.getList().add( new RestrictionItem( "e", "e", none ) );
this.setValues( new TreeMap< String, Boolean >() );
this.setCursor( 0 );
}
@PostConstruct
public void andThis() {
this.conversation.begin( );
}
// getters and setters for instance variables
@Override
public String toString() {
return "Values : " + this.values.toString( ) + " List: " + this.list.toString( );
}
public void kill() {
this.conversation.end( );
}
public void doNext(ActionEvent e) {
this.cursor++;
}
public void doPrev(ActionEvent e) {
this.cursor--;
}
}
Вот фрагмент XHTML:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>IGNORED</title>
</head>
<body>
<ui:composition>
<h:panelGroup id="container">
<h:form>
<!-- edit state -->
<h:panelGroup id="edit" rendered="#{hashBool.cursor eq 0}">
<code>
<h:outputText value="#{hashBool.toString()}" escape="false"/>
</code>
<ul>
<ui:repeat value="#{hashBool.list}" var="elem">
<li>
<h:selectBooleanCheckbox id="elem" value="#{hashBool.values[elem.id]}" title="#{elem.displayName}" />
<h:outputLabel for="elem" value="#{elem.displayName}"/>
</li>
</ui:repeat>
</ul>
</h:panelGroup>
<!-- view state -->
<h:panelGroup id="view" rendered="#{hashBool.cursor eq 1}">
<code>
<h:outputText value="#{hashBool.toString()}" escape="false"/>
</code>
</h:panelGroup>
<br/>
<!-- buttons -->
<h:panelGroup id="buttons">
<f:ajax render=":container">
<h:commandButton value="Prev" actionListener="#{hashBool.doPrev}"/>
<h:commandButton value="Next" actionListener="#{hashBool.doNext}"/>
</f:ajax>
<h:commandButton value="Kill" actionListener="#{hashBool.kill()}"/>
</h:panelGroup>
</h:form>
</h:panelGroup>
</ui:composition>
</body>
</html>
Любые предложения приветствуются! (И извините, если это двойной пост, я не смог найти ничего похожего при поиске здесь)
1 ответ
Главным образом, чтобы гарантировать, что Мудрость Древних остается должным образом задокументированной (http://xkcd.com/979/): Оказывается, это ошибка в JSF 2.0.2 (которая поставляется в комплекте с Liferay 6.0 GA 4). Смотрите здесь для получения дополнительной информации: http://java.net/jira/browse/JAVASERVERFACES-1561