orbeon插入重复

时间:2010-11-03 19:42:05

标签: xforms orbeon

我在使用xbl组件在特定位置插入行时遇到问题。如果我在末尾插入行,但是如果我尝试在中间插入行,则不会调用xbl components init方法。

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

尝试多次单击Add Another,您会看到它没有填充输入框旁边的大小。

您可以从以下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

3 个答案:

答案 0 :(得分:0)

两件事:

首先,确保用于初始化对象的方法称为init()(不是initialize())。这是因为在调用ORBEON.xforms.XBL.declareClass()时注入的管道确保每次调用instance()时,如果找不到当前组件的实例,则会创建一个,{{1}正在调用该对象。它还确保只调用init()一次。

其次,除了init()之外,还要将xxforms-iteration-moved添加到触发XBL对象初始化的事件中:

xforms-enabled

根据我所看到的这两个变化,组件似乎得到了正确的初始化(我在文本字段后面的每行上得到0/10)。

答案 1 :(得分:0)

答案 2 :(得分: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的代码中完成了类似的事情。