Я использую JSF2.0 и собираю мастера. Я столкнулся с проблемой с SelectBooleanCheckboxes. Вот рабочий процесс:
- Загрузить страницу с флажками (значения привязаны к SortedMap в компоненте поддержки).
- Отметьте их и нажмите «Далее». Это увеличивает курсор, который страница использует, чтобы определить, какая группа групп загружается.
- (правильные) значения сохраняются в компоненте.
- Нажмите назад (курсор уменьшен), и страница отобразит редактируемые флажки. Первый флажок не отмечен (хотя связанная переменная содержит значение 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>
Любые предложения приветствуются! (И извините, если это двойной пост, я не смог найти ничего похожего при поиске здесь)