Orbeon вставить в повторе - PullRequest
       16

Orbeon вставить в повторе

1 голос
/ 03 ноября 2010

У меня проблемы с вставкой строки с компонентами xbl в определенную позицию. Это работает, если я вставляю строку в конце, но если я пытаюсь вставить строку в середине, метод инициализации компонентов xbl не вызывается.

Вот 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 / ошибка-в-повторе-в-систему управления, имеющую Релевантные-td2331649.html # a2533819). Это та же ошибка, но она упростилась, удалив соответствующие.

Я использую Orbeon 3.8, и в строке 3798 xforms.js есть следующий код. Если у меня есть атрибут at во вставке, он никогда не идет внутрь. Это потому, что я пытаюсь вставить строку, где строка была ранее инициализирована.

                    if (! this.initialized) {
                        originalInit.call(this);
                        this.initialized = true;
                    }

Это ошибка?

Спасибо Бинеш Гуммади

Ответы [ 3 ]

0 голосов
/ 06 января 2011

https://gist.github.com/768034

Вот упрощенная версия той же ошибки.Когда управление становится релевантным после того, как оно стало неактуальным, метод init не вызывается, что восходит к моим предыдущим наблюдениям (строка xforms.js 3798).

Шаги для воспроизведения

  1. Наблюдайте два предупреждения призагрузка страницы
  2. Снимите флажок
  3. Установите флажок (соблюдайте только одно предупреждение. «Инициализированное» предупреждение не отображается)

Это правильное поведение?

0 голосов
/ 08 января 2011

(Это ответ на дополнительный вопрос , опубликованный в качестве ответа на этой странице. Подол.)

Да, это предполагаемое поведение, и я понимаю, как это может привести к путанице. Идея метода 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: .

0 голосов
/ 09 ноября 2010

Две вещи:

Сначала убедитесь, что метод, используемый для инициализации вашего объекта, называется 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 в каждой строке после текстового поля).

...