2015-02-09 70 views
0

我在eXist 2.2中使用RESTXQ服務器中的XSLTForms。將複選框添加到XForms重複結構

我有一個搜索表單,可以讓用戶查詢遠程API,如果查詢匹配,它將使用一組XML記錄做出響應。我使用xf:repeat來迭代記錄,我希望能夠在每條記錄的頭部提供一個複選框,以便用戶可以選擇他們想要的記錄。但是,當我在xf:repeat(使用綁定到布爾值的xf:input)內放置複選框元素時,我沒有獲得所需的功能。而不是彼此獨立,複選框作爲一個組被激活。當我點擊第一個框時,第二個框也被激活,等等。這看起來好像是一個常見的用例,但我似乎找不到任何文檔或示例來顯示如何實現它。

我知道我需要以某種方式同步這兩個實例,以確保每個複選框都有一個新的bool元素,並且我嘗試了與xf:insert不同的方法,但我無法獲得任何工作。

型號片段:

<xf:instance xmlns="" id="default"> 
    <results>    
     <sru:record sru:test="false"> 
      <sru:recordData> 
       <marc:record> 
       ... 
       </marc:record> 
      </sru:recordData> 
     </sru:record> 
     <sru:record sru:test="false"> 
      <sru:recordData> 
       <marc:record> 
       ... 
       </marc:record> 
      </sru:recordData> 
     </sru:record>     
    </results> 
</xf:instance> 

<xf:bind nodeset="instance('default')/sru:record/@sru:test" id="checkVal" type="xs:boolean"/> 

表格片段與xf:repeat

<div> 
    <xf:repeat 
    nodeset="instance('default')/sru:record/sru:recordData/marc:record" 
    id="marc-repeat" appearance="full"> 
     <div class="checkbox"> 
      <xf:input incremental="true" ref="../../@sru:test"> 
       <xf:label>Select</xf:label>  
       <xf:action ev:event="DOMActivate">          
        <xf:setvalue 
        bind="checkVal" 
        if=". = boolean-from-string('false')">true</xf:setvalue> 
        <xf:setvalue 
        bind="checkVal" 
        if=". = boolean-from-string('true')">false</xf:setvalue>  
       </xf:action>       
      </xf:input> 
     </div> 
     ... 
    </xf:repeat> 
</div> 

回答

0

我終於明白我只需要一個嵌套的xf:repeat來遍歷這組記錄。我認爲我的問題源於對於我最終刪除的元素的功能混淆。通過修改後的表單結構,每個@sru:test屬性的值現在都會獨立更新。

表單代碼與xf:repeat

<div> 
    <xf:repeat 
    nodeset="instance('default')/sru:record/sru:recordData" 
    id="marc-repeat" appearance="full"> 
     <div class="checkbox"> 
      <xf:repeat nodeset="marc:record"> 
       <xf:input incremental="true" ref="../../@sru:test"> 
        <xf:label>Select</xf:label>  
        <xf:action ev:event="DOMActivate">          
         <xf:setvalue 
         bind="checkVal" 
         if=". = boolean-from-string('false')">true</xf:setvalue> 
         <xf:setvalue 
         bind="checkVal" 
         if=". = boolean-from-string('true')">false</xf:setvalue>  
        </xf:action>       
       </xf:input> 
      </div> 
      ... 
    </xf:repeat> 
</div> 
4

的XForms允許具有相同的節點被綁定到許多控件和所有這些控制,其結果,被同步在更新。

在您的示例中,在不同實例中只有一個關閉元素。當輸入控件在重複中綁定到此元素時,XForms引擎將呈現與重複節點集中的節點一樣多的相同控件。

我想你想檢查記錄:爲此,你需要,例如,在每個記錄內的專用屬性。這可以通過XForms操作完成:每次從服務器檢索記錄實例時,關聯的操作可以插入這樣的屬性。使用eXistdb,可能會更容易要求服務器使用此額外屬性生成記錄實例。

+0

謝謝你,阿蘭。當我在服務器上處理數據時,我現在添加了「@sru:test」屬性。我更新了示例數據以反映我所做的更改。但是,現在我無法弄清楚如何從客戶端更新每條記錄的測試屬性。正如我現在所知,它只會更新序列中第一條記錄的值。 – tat 2015-02-09 15:44:57

+0

我不明白爲什麼你爲輸入添加了一個動作,因爲這應該是無用的。很明顯,setvalue動作只會考慮綁定的第一個節點。 – 2015-02-10 18:37:46

+0

當我激活複選框時,不應該改變實例數據中屬性的值嗎?如果我刪除'xf:setvalue',單擊複選框,然後在XSLTForms Profiler中查看實例,則屬性值根本不會改變。 – tat 2015-02-10 21:14:25