XForms重复 - 询问用户的行数

时间:2012-12-16 09:04:54

标签: xforms xforms-betterform

我想通过xf:输入询问用户,在某个重复中你想要“多少项”,然后,根据用户的响应,呈现一个重复的行数(我猜测也会在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>

3 个答案:

答案 0 :(得分:2)

动作的while和iterate属性将重复此动作。

答案 1 :(得分:1)

从用户获取信息的一种方法是将输入窗口小部件绑定到辅助文档中的元素(我经常将该文档称为ui,因为它保存用户界面状态信息)并控制插入和显示从那以后。如果要强制用户提供值,可以将其设置为0;如果不这样做,您可以提供一些合理的默认号码,用户可以根据需要覆盖这些号码。

答案 2 :(得分:1)

如果我理解的话,你会问两个不同的问题:

  1. 如何提示用户
  2. 如何插入给定的迭代次数
  3. 这是

    1. 要提示用户,您可以使用对话框(xforms:dialog由XForms 2.0标准化,Orbeon Forms支持xxforms:dialog扩展名。您还可以使用xforms:switch来显示/隐藏字段与重复字段。

    2. 获得该值后,您可以像Alain所说的那样,使用whileiterate属性多次执行插入操作。或者,如果您有XPath 2.0,则可以在for表达式中使用origin

    3. 这是一个完整的示例,显示了两种插入方式:

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