1

xf:input を介してユーザーに特定の繰り返しで「項目数」を尋ねたいと思います。次に、ユーザーの応答に基づいて、その行数で繰り返しを提示します (これは、 xf:instance で生成されます)。

トリガーを使用して行を挿入および削除する方法に精通しています。

ここで私が求めているのは、作成して表示する最初の行数をユーザーに求める方法です。

たとえば、ユーザーが 10 行を希望したとします。彼らがその質問に答えるまで、繰り返されるデータを関連性のないものにすることができると思います。彼らがそれに答えると、何らかのアクションで行が動的に作成され、繰り返されるデータが関連性を持つようになります。

しかし、これを行う方法は?

12月20日更新

以下のマークアップは入力フィールドを示しており、より良い形式では、ボタンが押されたときにインスタンスに行が追加されます。ただし、betterForm は UI にデータを表示しません (これは厳密には別の質問だと思いますが)。私は他の実装を試していません。

<xhtml:head>
    <xf:model id="m">
        <xf:instance id="main-instance">
          <data>
            <items>
              <item1>item 11</item1>
              <item2>item 12</item2>
              <item3>item 13</item3>
            </items>
          </data>
          </xf:instance>


        <xf:instance id="variable">
            <variable xmlns="">
                <iteration-count/>
            </variable>
        </xf:instance>
    </xf:model>
</xhtml:head>
<xhtml:body>

  <!-- Simple field to enter the number of iterations -->
  <xf:input ref="instance('variable')/iteration-count">
    <xf:label>How many iterations?</xf:label>
  </xf:input>

  <xf:trigger>
    <xf:label>Insert with while</xf:label>
    <xf:action ev:event="DOMActivate">
            <xf:action while="instance('variable')/iteration-count != 0">
                <xf:insert ev:event="DOMActivate" nodeset="items"/>
                <xf:setvalue ref="instance('variable')/iteration-count" value=". - 1"/>
            </xf:action>
          <!--<xf:refresh model="m"/>-->
        </xf:action>
    </xf:trigger>


  <table>

    <tbody id="r-attrs" xf:repeat-nodeset="items">
      <tr>
        <td>
          <xf:output ref="item1"></xf:output>
        </td>
        <td>
          <xf:output ref="item2"></xf:output>
        </td>
        <td>
          <xf:output ref="item3"></xf:output>
        </td>
      </tr>
    </tbody>

  </table>       

</xhtml:body>

4

3 に答える 3

2

アクションの while および iterate 属性は、このアクションを繰り返します。

于 2012-12-16T09:25:46.743 に答える
1

私がよく理解している場合、あなたは2つの別々の質問をしています。

  1. ユーザーにプロンプ​​トを表示する方法
  2. 指定された反復回数を挿入する方法

これが

  1. ユーザーにプロンプ​​トを表示するには、ダイアログを使用できます(xforms:dialogXForms 2.0で標準化されており、Orbeon Formsはxxforms:dialog拡張機能をサポートしています)。xforms:switchを使用して、フィールドとリピートを表示/非表示にすることもできます。

  2. 値が取得されると、Alainが言うように、whileまたはiterate属性を使用して挿入アクションを何度も実行できます。または、XPath 2.0を使用している場合forは、origin式でaを使用できます。

これは、挿入の2つの方法を示す完全な例です。

<xh:html xmlns:xh="http://www.w3.org/1999/xhtml"
      xmlns:xf="http://www.w3.org/2002/xforms"
      xmlns:ev="http://www.w3.org/2001/xml-events">
    <xh:head>
        <xf:model>
            <xf:instance id="repeats">
                <repeats/>
            </xf:instance>
            <xf:instance id="count">
                <count/>
            </xf:instance>
        </xf:model>
    </xh:head>
    <xh:body>

        <!-- Simple field to enter the number of iterations -->
        <xf:input ref="instance('count')">
            <xf:label>How many iterations?</xf:label>
        </xf:input>

        <!-- Variant 1 -->
        <xf:trigger>
            <xf:label>Insert with for</xf:label>
            <xf:insert
                ev:event="DOMActivate"
                if="instance('count') castable as xs:integer"
                context="instance('repeats')"
                ref="repeat"
                origin="for $i in 1 to instance('count')
                        return xf:element('repeat')"/>
        </xf:trigger>

        <!-- Variant 2 -->
        <xf:trigger>
            <xf:label>Insert with while</xf:label>
            <xf:insert
                ev:event="DOMActivate"
                if="instance('count') castable as xs:integer"
                context="instance('repeats')"
                while="count(repeat) lt xs:integer(instance('count'))"
                ref="repeat"
                origin="xf:element('repeat')"/>
        </xf:trigger>

        <xf:trigger>
            <xf:label>Clear</xf:label>
            <xf:delete ev:event="DOMActivate" ref="instance('repeats')/*"/>
        </xf:trigger>

        <!-- Your repeat -->
        <xf:repeat ref="repeat">
            <xf:output value="position()"/>
        </xf:repeat>

    </xh:body>
</xh:html>
于 2012-12-17T18:54:14.657 に答える
1

ユーザーから情報を取得する 1 つの方法は、入力ウィジェットを補助ドキュメント (uiユーザー インターフェイスのステータス情報を保持しているため、このドキュメントと呼ぶことが多い) の要素にバインドし、そこから挿入と表示を制御することです。ユーザーに値の提供を強制したい場合は、デフォルトを 0 にすることができます。そうでない場合は、ユーザーが必要に応じて上書きできる妥当なデフォルト番号を提供できます。

于 2012-12-16T18:57:44.810 に答える