1

特定の位置に xbl コンポーネントを含む行を挿入できません。最後に行を挿入すると機能しますが、途中で行を挿入しようとすると、xbl コンポーネントの 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>

[別の追加] を複数回クリックしてみてください。入力ボックスの横にサイズが入力されていないことがわかります。

必要なjsファイルは以下のURLからダウンロードできます。(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;
                    }

これはバグですか?

ありがとう、ビネシュ・グマディ

4

3 に答える 3

0

https://gist.github.com/768034

これは、同じエラーの簡略化されたバージョンです。コントロールを無関係にした後に関連するようになると、 init メソッドが呼び出されず、以前の観察に戻ります(xforms.js行3798)。

再現する手順

  1. ページの読み込み時に 2 つのアラートを観察する
  2. チェックボックスをオフにします
  3. チェックボックスにチェックを入れます (1 つのアラートのみを監視します。「初期化された」アラートは表示されません)。

これは正しい動作ですか?

于 2011-01-06T15:52:06.830 に答える
0

2つのこと:

まず、オブジェクトの初期化に使用されるメソッドが呼び出されていることを確認しますinit()( ではありませんinitialize())。これは、呼び出し時に挿入される配管により、 を呼び出すORBEON.xforms.XBL.declareClass()たびinstance()に、現在のコンポーネントのインスタンスが見つからない場合にインスタンスが作成され、init()そのオブジェクトで呼び出されることが保証されるためです。また、init()が一度だけ呼び出されるようにします。

次に、XBL オブジェクトの初期化をトリガーするイベントに追加xxforms-iteration-movedします。xforms-enabled

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

これら 2 つの変更により、コンポーネントが適切に初期化されているように見えます (テキスト フィールドの後の各行で 0/10 を取得しています)。

于 2010-11-09T18:11:24.957 に答える
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 に答える