2011-09-12 7 views
1

immediate = "true"(JSF 1.2)で少し問題があります。私のフォームは車の事故についてです:ユーザーは、いくつかのubication情報を記入し、彼は(木、フェンス、他の車など)を希望のように、彼はできるだけ多く、影響を受けた項目を追加することができますimmediate = "true"および必須フィールドの問題

private String location; 
private List<T> items; 
private HtmlDataTable itemsUI; 

public void remove(ActionEvent e) { 
    String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id"); 
    items.remove(Integer.parseInt(id)); 
} 

public void add(ActionEvent e) throws InstantiationException, IllegalAccessException { 
    items.add(element.newInstance()); 
} 
をバックアップ

JSPX

<h:inputText 
required="true" 
value="#{ACC01.location}"/> 

<h:dataTable 
binding="#{ACC01.itemsUI }" 
value="#{ACC01.items}" 
var="item"> 
<h:column> 
    <h:selectOneMenu 
    value="#{item.id}> 
     <f:selectItems 
     value="#{ACC01.possibleElements}" /> 
    </h:selectOneMenu> 

    <h:commandLink 
    actionListener="#{ACC01.remove }" 
    value="Remove" > 
     <f:param 
     name="id" 
     value="#{ACC01.itemsUI.rowIndex }"/> 
    </h:commandLink>  
</h:column> 
</h:dataTable> 

<h:commandLink 
actionListener="#{ACC01.add}" 
value="Add" /> 

問題

  • dataTableの影響を受ける要素に対してimmediate = "true"を設定した場合、ユーザーが新しい要素を追加すると、他の要素はデフォルト値に戻ります(例:

  • 私が直ちに使用しない場合、影響を受けるのは、あなたが{'tree'、 'car'、 'fence'}を持っていれば、それらは{default、default、default、new element}要素は適切な値を保持しますが、ユーザーは影響を受ける要素を追加または削除する前に「場所」フィールドに入力する必要があります。私が欲しいもの

は、影響を受けた要素の値を、ユーザーが記入することなく、それらを追加または削除できるようにする 『キープ最初の場所』フィールドをできるようにすることです。

回避策

このトピックに関する多くの記事を読んだ後、行くための唯一の方法は、自動検証を回避し、ユーザーがフォームを送信したときにそれを手動で行うことであるようです。

必要なフィールドでヌルをチェックし、プログラムによってエラーメッセージをfacescontextに追加します。私はそれが醜いと思うので、私は本当にそれをしたくありません。

私が必要とする行動を達成するためのより良い方法をお勧めしますか?事前に

おかげで私の現在の仕事で、以前の開発者の

答えて

3

一つは、以下の溶液を用いてそれはないかもしれない豆

private UICommand btn; 

public boolean isSaving() 
{ 
    Map<?,?> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap(); 
    return (params.containsKey(btn.getClientId(ctx))); 
} 

をバックアップ

JSPX

<h:inputText required="#{ACC01.saving}" value="#{ACC01.location}"/> 

を思いつきましたあなたの状況ではまったく正しいですが、基本的に彼はab画面上のボタンからバッキングビーンの変数 'btn'に挿入されます。次に、inputTextはbtnがクリックされたときに必要なロケーションテキストのみを表示します。あなたの場合、それはコマンドリンクなので少し違うかもしれませんが、助けてくれると思っていました。

+0

ちょっとおかげさまで、やりたいことが少ないように聞こえますが、まだ機能的な解決策です。 –

+0

実際、私は何も変更する必要はありませんでしたが、スニペットはそのまま動作します。 Kartikにもう一度感謝します。 –

関連する問題