2010-11-03 108 views
1

我無法在特定位置插入具有xbl組件的行。它工作,如果我在最後插入行,但如果我嘗試在中間插入行,則不調用xbl組件的init方法。orbeon插入重複

這裏是xhtml。

<xhtml:head> 
    <xforms:model id="main" 
        xxforms:session-heartbeat="true" 
        xxforms:show-error-dialog="false" 
        xxforms:external-events="submit-save submit-preview submit-cancel"> 

     <xforms:instance id="instance"> 
      <root> 
       <repeat> 
        <item> 
         <title/> 
        </item> 
       </repeat>   
      </root> 
     </xforms:instance> 

     <xforms:instance id="proto-property"> 
      <item> 
       <title/> 
      </item> 
     </xforms:instance> 

     <xforms:bind nodeset="instance('instance')"> 
      <xforms:bind 
       nodeset="repeat/item/title" 
       required="true()" /> 
     </xforms:bind> 

    </xforms:model> 
    <xbl:xbl xmlns:xhtml="http://www.w3.org/1999/xhtml" 
    xmlns:xforms="http://www.w3.org/2002/xforms" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:ev="http://www.w3.org/2001/xml-events" 
    xmlns:xi="http://www.w3.org/2001/XInclude" 
    xmlns:xxi="http://orbeon.org/oxf/xml/xinclude" 
    xmlns:xxforms="http://orbeon.org/oxf/xml/xforms" 
    xmlns:fr="http://orbeon.org/oxf/xml/form-runner" 
    xmlns:saxon="http://saxon.sf.net/" 
    xmlns:oxf="http://www.orbeon.com/oxf/processors" 
    xmlns:xbl="http://www.w3.org/ns/xbl" 
    xmlns:xxbl="http://orbeon.org/oxf/xml/xbl" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xbl:script src="/apps/xforms-sandbox/samples/input-counted.js" /> 

    <xbl:binding id="fr-input-counted" element="fr|input-counted"> 
     <xbl:template xxbl:transform="oxf:unsafe-xslt"> 
      <xsl:transform version="2.0"> 
       <xsl:import href="oxf:/oxf/xslt/utils/xbl.xsl" /> 
       <xsl:template match="/*"> 
        <xforms:group xbl:attr="model context ref bind" xxbl:scope="outer"> 

         <xbl:content includes="xforms|label" />        

         <xsl:copy-of select="xxbl:parameter(., 'max')" /> 

         <xxforms:script ev:event="xforms-enabled" ev:target="#observer"> 
          YAHOO.xbl.fr.InputCounted.instance(this).initialize(); 
         </xxforms:script> 

         <xforms:group xxbl:scope="inner"> 
          <xxforms:variable name="binding" as="node()?"> 
           <xxforms:sequence select="." xxbl:scope="outer"/> 
          </xxforms:variable> 
          <xforms:input id="input-counted" class="fr-input-counted" ref="$binding" incremental="true" /> 
          <label class="counter-label"></label> 
         </xforms:group> 
        </xforms:group> 
       </xsl:template> 
      </xsl:transform> 
     </xbl:template> 
    </xbl:binding> 

</xbl:xbl> 

</xhtml:head> 

<xhtml:body class="body"> 

    <div> 
     <xforms:trigger appearance="full"> 
      <xforms:label> 
       Add Another 
      </xforms:label> 
      <xforms:insert ev:event="DOMActivate" at="1" 
      nodeset="repeat/item"/> 
     </xforms:trigger> 
    </div> 

    <xforms:repeat nodeset="repeat/item"> 
     <div> 
      <fr:input-counted ref="title" max="10"> 
       <xforms:label>Node Selector </xforms:label> 
      </fr:input-counted> 
     </div> 
    </xforms:repeat> 
</xhtml:body> 

嘗試點擊添加另一個多次,你會看到,它不填充旁邊的輸入框的大小。

您可以從以下URL下載所需的js文件。 (http://orbeon-forms-ops-users.24843.n4.nabble.com/Error-in-repeat-for-controls-having-relevant-td2331649.html#a2533819)。這是相同的錯誤,但通過刪除相關來簡化它。

我使用Orbeon 3.8和xforms.js行3798有以下代碼。如果我在插入「at」屬性,它永遠不會進入。這是因爲我試圖插入一行以前初始化一行。

    if (! this.initialized) { 
         originalInit.call(this); 
         this.initialized = true; 
        } 

這是一個錯誤嗎?

謝謝 Binesh Gummadi

+0

您可以創建一個包含XHTML + XBL + JS的單個文件,這樣我們可以更容易地重現這一點,並更新您的示例?我嘗試過這樣做,但是調用了'YAHOO.xbl.fr.InputCounted.instance(this).initialize()',並且'initialize()'沒有在代碼中的任何位置定義。請參閱:http://pastie.org/1272744 – avernet 2010-11-04 17:50:53

+0

感謝您回答亞歷克斯。我的錯!請看這個http://pastie.org/1272963它有正確的javascript 現在插入已經在=「1」,所以錯誤將發生在第3次迭代。如果將其更改爲2,則可以從第4次迭代中看到錯誤。 – BinnyG 2010-11-04 20:01:12

+0

感謝您的完整示例;這真的有幫助。我已經能夠運行這個,並看到我的迴應(http://stackoverflow.com/questions/4090978/orbeon-insert-in-repeat/4136986#4136986)。 – avernet 2010-11-09 18:12:22

回答

0

兩件事情:

首先,確保用於初始化對象被稱爲init()(未initialize())的方法。這是因爲調用ORBEON.xforms.XBL.declareClass()時注入的管道可確保每次調用instance()時,如果無法找到當前組件的實例,則會創建一個實例,並且將在該對象上調用init()。它也確保init()只被調用一次。

其次,除了xforms-enabled添加xxforms-iteration-moved到觸發XBL對象進行初始化的事件:

<xxforms:script ev:event="xforms-enabled xxforms-iteration-moved" ev:target="#observer"> 
    YAHOO.xbl.fr.InputCounted.instance(this).init(); 
</xxforms:script> 

有了這兩個變化,從我所看到的,分量似乎得到正確初始化(我在文本字段之後的每行上得到0/10)。

0

https://gist.github.com/768034

這裏是相同的錯誤的簡化版本。當控制變得相關後,使其不相關的init方法不會被調用,這回到我以前的觀察(xforms.js行3798)。

步驟來重現

  1. 在網頁加載時
  2. 取消選中該複選框
  3. 選中該複選框觀察兩個警報(只觀察一個警告。「初始化」不顯示警報)

這是正確的行爲?

+0

我發佈了一個答案作爲另一個答案,而不是更新我以前的答案,因爲這看起來像另一個(相關)問題(在這裏你沒有重複。 – avernet 2011-01-07 22:48:21

0

(這是一個答案張貼此頁上回答的後續question。哼哼。)

是的,這是預期的行爲,我明白這是如何的混亂。 init()方法的想法是初始化JavaScript對象並對DOM進行一些初始化。如果您使用instance()獲得了對象的實例,則在您的對象上調用任何其他方法之前,將自動爲您調用此方法。

這解釋了爲什麼當組件再次啓用時,您看不到init()。你想在這裏做的是分裂的代碼你在init()爲:

  • 真正初始化該組件的一部分 - 你保持init()
  • 改變組件外觀的部分,使其顯示爲啓用 - 您將其放入新方法enabled()

然後你寫:

<xxforms:script ev:event="xforms-enabled"> 
    YAHOO.xbl.fr.InputCounted.instance(this).enabled(); 
</xxforms:script> 

注意,你不需要調用init()明確;這將在任何其他方法被調用之前爲您完成。在代碼fr:button中做了類似的事情。