2010-06-03 91 views
1

我正在更改我的代碼以在XForms中使用綁定(這比在任何地方使用節點集都更好),但是我收到了錯誤。XForms綁定元素錯誤

我收到錯誤信息是:「錯誤:錯誤的XForms(8):ID(data_criterion)並不是指一個bind元素......」

從教程/指南我一直在用,似乎好像這應該起作用,但顯然我錯過了一些東西! (順便說一下,我正在模擬我的綁定代碼後,在這裏的例子:http://en.wikibooks.org/wiki/XForms/Bind

我原本以爲這個問題是由於我使用xf:select控件而不是xf:輸入像例子,但即使一次我把我的代碼弄糊塗到最簡單的代碼,我仍然收到錯誤!

這是我使用的型號代碼:

<xf:model id="select_data"> 

    <xf:instance id="criteria_data" xmlns=""> 
     <file> 
      <criteria> 
       <criterion></criterion> 
      </criteria> 
     </file> 
    </xf:instance> 

    <bind id="data_criterion" nodeset="instance('criteria_data')/criteria/criterion"/> 

</xf:model> 

至於UI代碼,這是我有:

<xf:input bind="data_criterion"> 
    <xf:label>Enter criteria:</xf:label> 
</xf:input> 

我收到錯誤信息是:「錯誤:的XForms錯誤(8):id(data_criterion)沒有引用綁定元素...「

任何人都有任何洞察到問題是什麼?另外,是否有特殊用法的綁定和xf:select(帶有xf:itemset)控件,我應該知道的? (我最終在我的窗體上使用了很多xf:select控件..)

在此先感謝!

編輯:

我跑的代碼通過這個validator,我看到此消息(指的是結合線): 「警告:如果下面的元件已應用XForms名稱空間?:綁定(第66行)」

+0

我看不出使用結合是如何更好的做法。如果您沒有任何元素的驗證規則,那麼您不需要綁定,也不需要編寫它。較少的代碼意味着更少的錯誤。 – Tambet 2010-06-04 08:41:31

+0

我看到它的方式,就像使用變量和較少的「硬編碼」。這樣,如果模型發生變化,我不必搜索整個文檔就可以更改每個應該更改的節點集。這在修改和維護代碼後可能會導致很多頭痛和錯誤。使用綁定意味着文檔只有一個變化,而沒有它們,它可能是一百!對?所以我相信這是更好的做法。 (加上我讀了它的地方;)哈哈。 – developer 2010-06-04 14:35:00

+0

表示同意。我認爲關鍵是「使用綁定更好的實踐」並不一定總是如此。添加一個綁定會增加一個間接級別,在某些情況下,這意味着您有更多的代碼來編寫,讀取,維護和理解,而且有限的好處。 – avernet 2010-06-04 16:47:21

回答

2

你可能要幾件事情改變:

  1. 不知道這是錯誤的原因,但nodeset的表述應該是instance('criteria_data')/criteria/...,沒有file。記住:instance()返回根元素,而不是文檔節點。 (這個你通過更新問題照顧好;好)
  2. 您在bind上缺少xf。它應該是:<xf:bind id="data_criterion" nodeset="instance('criteria_data')/criteria/criterion"/>

看到一個完整的例子下面與您的代碼,這下Orbeon形式爲我工作得很好:

<xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml" 
     xmlns:xforms="http://www.w3.org/2002/xforms" 
     xmlns:xf="http://www.w3.org/2002/xforms" 
     xmlns:xxforms="http://orbeon.org/oxf/xml/xforms" 
     xmlns:ev="http://www.w3.org/2001/xml-events" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:fr="http://orbeon.org/oxf/xml/form-runner"> 
    <xhtml:head> 
     <xhtml:title>SO Bind</xhtml:title> 
     <xf:model id="select_data"> 

      <xf:instance id="criteria_data" xmlns=""> 
       <file> 
        <criteria> 
         <criterion>Gaga</criterion> 
        </criteria> 
       </file> 
      </xf:instance> 
      <xf:bind id="data_criterion" nodeset="instance('criteria_data')/criteria/criterion"/> 
     </xf:model> 

    </xhtml:head> 
    <xhtml:body> 
     <xf:input bind="data_criterion"> 
      <xf:label>Enter criteria:</xf:label> 
     </xf:input> 
    </xhtml:body> 
</xhtml:html> 
+0

嗯......這是一個很好的觀點,也是我的一個疏漏。但我仍然有錯誤.. :(我會在我的問題中編輯我的代碼,以反映這一點,但謝謝你的回覆!:) – developer 2010-06-04 14:39:33

+0

@iHeartGreek,'bind'上也有一個缺失的前綴。見上面的#2和我編輯的迴應。 OMG。 – avernet 2010-06-04 16:57:33

+0

OMG。謝謝。就是這樣...... :( 現在我覺得非常愚蠢,謝謝你的額外的眼睛,我現在會盡量更加小心,我想刪除這個問題,因爲我很尷尬,但我不會因爲你應得的要回答!:) – developer 2010-06-04 17:02:22