2012-01-18 16 views
0

私はJSF2.0を使用しており、ウィザードを構築しています。 SelectBooleanCheckboxesで問題が発生しました。SelectBooleanCheckboxレンダリング状態がバッキングBeanと一致しません

  • チェックボックス付きのページを読み込みます(値はバッキングBeanのSortedMapにバインドされています)。
  • これをチェックし、[次へ]をクリックします。これは、パネルがどのPanelGroupをロードするかを決定するために使用するカーソルをインクリメントします。
  • (正しい)値はBeanに永続化されます。
  • クリックすると(カーソルが減少します)、ページで編集可能なチェックボックスがレンダリングされます。最初のチェックボックスはチェックされません(バインドされた変数がそのボックスに対してtrueの値を保持していても)。

このカーソルベースのアプローチ(すべてのウィザード画面が含まれています)は機能していないようです。しかし、これを少し修正して、前/次のボタンが別のxhtmlページを表示するようにすると、この問題は解消されます。

残念ながら私はこれを行うことはできません。このウィザードをモーダルダイアログに接続するので、前/次の新しいページを訪れることはできません。

ウィザードの全体を尋ねるのではなく、 。ここで

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

任意の提案は大歓迎です! (そして、これが二重の投稿であれば申し訳ありませんが、私はここで検索している間に何か類似のものを発見することができました)

答えて

0

主に古代の知恵が適切に文書化されていることを確認するためにhttp://xkcd.com/979/ :これはJSF 2.0.2(Liferay 6.0 GA 4にバンドルされています)のバグです。詳細はこちらをご覧ください:http://java.net/jira/browse/JAVASERVERFACES-1561

+0

Liferay/Glassfishを使用する必要がある場合は、6.1 GA 1バンドルを使用してください。 – asellitt

関連する問題