我在使用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
答案 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的代码中完成了类似的事情。