2017-05-05 13 views
0

新しい目標が必要なたびに、1つの行に3つのフィールドを作成する必要があります。目標1、中期1、中年1。次に、objective2を追加すると、midYear2、endYear2などが追加されます。最初はすべてが機能しているように見えますが、2回目には多くのフィールドが作成されます。私はviewScopeの変数がすべて正しいので、私が入れ子にしている/入れ子にしていない/自分のリピートを正しく使っていると仮定しているので、自分が混乱しているフィールドを表示しているだけです。私はちょうど1列ごとに3つのフィールドをそれぞれ必要とし、新しい行と繰り返し.....以下のコードは、しかし、誰かがより良いアプローチを持っている場合は、提案にも開いています.....ありがとうXpagesリピートコントロールとダイナミックフィールドの作成/表示

<xp:this.data> 
<xp:dominoDocument 
    var="document1" 
    formName="objective"> 
</xp:dominoDocument> 
</xp:this.data> 


<xp:repeat id="repeat1" rows="100" value="#{viewScope.fields}" 
    var="fieldName"> 
     <xp:repeat id="repeat2" rows="100" value="#{viewScope.fields2}" 
    var="fieldName2"> 

     <xp:repeat id="repeat3" rows="100" value="#{viewScope.fields3}" 
    var="fieldName3"> 

    <div class="row"> 

     <div class="col-xs-4"> 
      <xp:label value="#{fieldName}" for="inputText1"> 
      </xp:label> 
      <xp:inputText id="inputText1"> 
       <xp:this.value><![CDATA[#{document1[fieldName]}]]></xp:this.value> 
      </xp:inputText> 
     </div> 

     <div class="col-xs-4"> 
      <xp:label value="#{fieldName2}" for="inputText2"> 
      </xp:label> 
      <xp:inputText id="inputText2"> 
       <xp:this.value><![CDATA[#{document1[fieldName2]}]]></xp:this.value> 
      </xp:inputText> 
     </div> 


     <div class="col-xs-4"> 
      <xp:label value="#{fieldName3}" for="inputText3"> 
      </xp:label> 
      <xp:inputText id="inputText3"> 
       <xp:this.value><![CDATA[#{document1[fieldName3]}]]></xp:this.value> 
      </xp:inputText> 
     </div> 

    </div> 
</xp:repeat> 
      </xp:repeat> 
    </xp:repeat> 


<xp:button 
value="Add Objective" 
id="button1"> 
<xp:eventHandler event="onclick" submit="true" refreshMode="partial" 
    refreshId="repeat1"> 
    <xp:this.action><![CDATA[#{javascript: 
     if (!viewScope.fields) { 
      viewScope.fields = []; 
      viewScope.fields2 = []; 
      viewScope.fields3 = []; 
      var count:integer = 1; 
     }   
     viewScope.fields.push("Objective" + (viewScope.fields.length + 1)); 
     viewScope.fields2.push("MidYear" + (viewScope.fields2.length + 1)); 
     viewScope.fields3.push("EndYear" + (viewScope.fields3.length + 1)); 
     count = count+1; 

    }]]></xp:this.action> 
</xp:eventHandler> 

答えて

0

問題がcoumn 1の各エントリのために、入れ子にすることで、あなたはその後、カラム2のNインスタンスを作成している列の各エントリのために、あなたが列3のNインスタンスを作成しているということです。このアプローチが必要な場合は、個々のviewScope変数を作成することをお勧めします。各変数には、オブジェクトまたは配列としての各オブジェクトのフィールド名があり、単一のviewScope変数で

Notes for Client /従来のDomino Webは、フォームが保存用のスキーマとデザイン用のフォームの両方であったため、同じUIで複数のドキュメントを簡単に編集することができなかったため、 UI。

XPageとは、もはや制限ではありません。 XPageはUIです(dominoDocument/bean)。データソースはストレージ用のスキーマです。

結果として、私の好ましいアプローチは、格納のための構造をより細かい要素に分割することです。だから、各Objectiveは "objective"、 "midYear"、 "endYear"という固定バインディングを持つ独自のドキュメントになります。

新しいエントリを作成するには、さまざまな方法があります。 1つは固定された行の一番上にあり、dominoDocumentデータソースはscope="request" ignoreRequestParams="true"です。 Saveは、NoteID/UNIDをリピートに追加し、関連する文書から値を取得して表示/編集することができます。

さらに進んだアプローチは、追加のオプション(開始または終了時)を指定してviewScope変数を作成し、リピート内にあるdominoDocumentデータソースを計算して、関連するドキュメント(つまりaction="openDocument")を取得するか、 (すなわち、action="newDocument")。

+0

こんにちはポール このアプローチでは、編集/完成するために各文書/目的を開く必要がありますか?要件は、ドキュメントを1つだけ必要とし、その上のすべてのフィールドに塗りつぶし/編集し、クリック数を減らすことが望ましい......おそらく最良のアプローチではないが、彼らが望むもの... –

+0

必ずしもそうではない'action'プロパティを" editDocument "に計算することができます。これは、多くのドキュメントが同時に編集モードで開かれることを意味するため、通常は私の好みの選択肢ではないため、コードがさまざまな場所からそれらを更新できる場合、競合のリスクが高くなります。しかし、それはここでは当てはまらないかもしれません。あるいは、小さなBeanを作成し、バックエンド文書と直接対話することもできます。 –

+0

こんにちはPaul、申し訳ありません、私は応答するのを忘れました。私が構築していたことの単純さのために、私はちょうどviewScope変数のフィールドの配列にバインドされたそれぞれの繰り返しで3つの列のそれぞれに1つの繰り返しを作成しました。また、viewScope変数を更新して行数を保存し、保存時にドキュメントに設定してから、ページ読み込み前にviewScope変数を事前に設定しています。あまりにも多くの作業をすることなくフィールドを動的に追加/削除できるようになりました。あなたの提案をありがとう! –

関連する問題