2010-11-03 87 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中做了类似的事情。