1

我无法在特定位置插入带有 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>

尝试多次单击“添加另一个”,您会看到它没有填充输入框旁边的大小。

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

4

3 回答 3

0

两件事情:

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

其次,xxforms-iteration-moved除了xforms-enabled触发初始化 XBL 对象的事件之外,还添加:

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

通过这两个更改,据我所知,组件似乎已正确初始化(我在文本字段之后的每一行上都得到了 0/10)。

于 2010-11-09T18:11:24.957 回答
0

https://gist.github.com/768034

这是同一错误的简化版本。当控制在使其无关之后变得相关时,不调用 init 方法,这可以追溯到我之前的观察(xforms.js 第 3798 行)。

重现步骤

  1. 在页面加载时观察两个警报
  2. 取消选中复选框
  3. 选中复选框(仅观察一个警报。不显示“已初始化”警报)

这是正确的行为吗?

于 2011-01-06T15:52:06.830 回答
0

(这是对在此页面上作为答案发布的后续问题的答案。哼哼。)

是的,这是预期的行为,我理解这可能会造成混淆。该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的代码中进行了类似的操作。

于 2011-01-07T22:47:07.497 回答