2012-03-15 6 views
5

私はx noから始めたいと思います。 (私のアプリでは、テキストデータフィールドと数値データフィールドのペアを持っています)、xpageアプリケーション(例えば10ペア)で "more fields"をクリックすると、ページ上で更新しますが、無制限にしたいと考えています。 (ページがクラッシュしない限り)、フォームとそのフィールドすべてのデータを送信したいと考えています。これを実装する最良の方法は何ですか?Xpagesボタンをクリックすると、より多くのフィールドが(無制限)

答えて

16

通常、フィールドは、ドット表記を使用してドキュメントデータソースにバインドされている:

<inputText value="#{contact.firstName}" /> 

しかし、配列表記もサポートされている:

<inputText value="#{contact['firstName']}" /> 

この後者のシンタクス内のフィールド名がされているためBeanの暗黙のプロパティではなく、文字列として扱われるため、動的に計算することができます。これらの動的フィールドを定義する最も簡単な方法は、基本タイプの各フィールドのカスタムコントロールを作成し、それぞれをデータソースとフィールド名を受け入れるように定義することです。だから、フィールド自体は、次のような構文で終わる:

<inputText value="#{compositeData.dataSource[compositeData.fieldName]}" /> 

その構文を使用することにより、任意の複雑さの計算は、カスタムコントロールに渡すためにどのようなフィールド名を決定するために使用することができます。シナリオでは、フィールドペアは、あなたがそれぞれのフィールドの接尾辞を指定できるようになる取り囲んリピート制御にindexVarを指定して、達成しようとしている...おそらく次のようなもの:これにより

<xp:repeat indexVar="fieldSuffix" value="#{viewScope.rowCount}"> 
<xp:div> 
    <xc:dynamicInputText dataSource="#{contact}" fieldName="fullName_#{fieldSuffix}" /> 
    <xc:dynamicInputNumber dataSource="#{contact}" fieldName="phoneNumber_#{fieldSuffix}" /> 
</xp:div> 
</xp:repeat> 

アプローチを使用すると、 "fullName_0"、 "fullName_1"などのフィールドがviewScopeで指定された制限まで終了します。通常は、既存の文書が開かれたときに、viewScope変数が正しい限度に戻されることを保証するだけです。もちろん、もう一つのアプローチは、実際には、ドキュメント上の別のアイテムとして制限を保存し、代わりにリピート値をバインドすることです。

+0

ありがとうございます、ティムは間違いなくこれを行ってあなたに投稿してください。私はこれを試したことはありませんが、繰り返しコントロールを部分的にリフレッシュするかどうかは、既存のデータを失うことはありませんか? – pipalia

+3

私はかなり正確に同じ行に沿ってこれに答えようとしていましたが、このメソッドはうまくいきます。なぜ新しいフィールドが表示されないのか不思議ではないので、 'repeat limit'をviewScopeの制限と同じにすることをお勧めしますあなたが30ヒットした後。 –

+1

素晴らしい提案、デクラン。もちろん、リピートにページャーを付けることもできますが、このタイプのインターフェースでは、ほとんどのユーザーはビュータイプのインターフェースと同じようにページネーションを使用できるとは考えていません。おそらく好ましいでしょう。 –

3

練習23「テーブルウォーカー」もご覧ください。複数のフィールドを処理するのではなく、複数の値を持つフィールドがあり、処理や保存の点で優れています(@Elementsを使ってドキュメント内にいくつのフィールドがあるか調べることができます)。練習はここにあります: http://www-10.lotus.com/ldd/ddwiki.nsf/dx/Tutorial-Introduction-to-XPages-Exercise-23 ボタンは一度に1行しか追加しませんが、調整は簡単です。

+0

ありがとう、ありがとう、 – pipalia

2

あなたができることは2つの文字列値LabelとDataを持つBeanと、そのオブジェクトのArrayListを持つマネージドBeanです。リピートコントロールの中で、繰り返しをArrayListにバインドしてから、xp:inputText rowData.Dataに、xp:ラベルをrowData.Labelに追加すると、さらに5行追加するだけですが、さらに多くのオブジェクトがArrayListに追加され、ページが更新されると、データはまだarraylistに保存され、5データを追加できる新しい空のオブジェクト。

public class Data { 

private String label; 
private String data; 

public Data() { 

} 
//getters and setters 

} 

public class ManagedBean { 

private ArrayList<Data> datalist; // add a managed property for this one so It will create a new one when needed. 

// getters and setters 

public addFiveMoreObjects() { 
    Data newItem; 
    for (int i=0; i<5; i++) { 
     newItem = new Data(); 
     datalist.add(newItem); 
    } 
} 

} 

<xp:repeat value="#{managedBean.datalist}" var="rowData"> 
<xp:text value="#{rowData.label}" /> 
<xp:inputText value="#{rowData.data} /> 
</xp:repeat> 

<xp:button value="Add 5 More"> // call #{managedBean.addFiveMoreObjects} 
+0

これは本当に面白いと共有のための多くのありがとう。私はまだJavabeansを開発していないので、まず他の方法を試みるかもしれません。 – pipalia

関連する問題