Скопируйте содержимое первого раздела в другие существующие разделы.

Предположим, что это экземпляр моей модели:

<xforms:instance id="main">
    <form>
        <section-1/>
        <section-2/>
        <rep-section>
            <a/>
            <b/>
            <c/>
        </rep-section>
    </form>
</xforms:instance>

У меня есть сценарий, в котором у меня есть повторяемый раздел <rep-section>, который можно динамически добавлять в форму с помощью кнопки «Добавить» в форме. Только в первом разделе есть еще одна кнопка «Копировать в другие разделы», которая при нажатии должна копировать все содержимое первого раздела в остальные разделы. Скажем, если у меня есть 7 разделов, то содержимое первого раздела должно быть скопировано в оставшиеся 6 разделов.

Пожалуйста, сообщите, как мы можем этого добиться.

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

<xforms:trigger appearance="minimal">
    <xforms:label>Copy to other Sections</xforms:label>
    <xforms:action ev:event="DOMActivate">???</xforms:action>
</xforms:trigger>

person Jayy    schedule 20.01.2012    source источник
comment
А при нажатии кнопки Копировать в другие разделы вы хотите, чтобы содержимое других разделов удалялось, т.е. заменялось содержимым первого раздела? Другие разделы называются <section-2>, <section-3>, <section-4> и т. д.?   -  person avernet    schedule 26.01.2012
comment
Привет, когда у меня есть 4 повторяющихся раздела, тогда будет 4 узла ‹rep-section›. Когда я нажимаю кнопку, я не возражаю против данных для разделов в 2,3 и 4. Мы можем удалить 2,3,4 или просто заменить значение узла внутри них первым разделом. но я хочу знать оптимизированный подход, потому что моя форма позволяет пользователю добавлять до 100 дополнительных разделов. Поэтому с точки зрения производительности я ищу оптимизированный подход. Спасибо   -  person Jayy    schedule 26.01.2012


Ответы (1)


Следующее сделает это:

<xforms:trigger>
    <xforms:label>Copy to other section</xforms:label>
    <xforms:action ev:event="DOMActivate">
        <xxforms:variable name="source" select="."/>
        <xforms:action ev:event="DOMActivate" xxforms:iterate="../* except .">
            <xforms:delete ref="*"/>
            <xforms:insert context="." origin="$source/*"/>
        </xforms:action>
    </xforms:action>
</xforms:trigger>

Вы можете увидеть в действии этот полный пример.

person avernet    schedule 26.01.2012
comment
Я пока не пробовал этот синтаксис «ожидания» в выражениях xpath ... полезно знать. отличный ответ. Большое Вам спасибо. - person Jayy; 27.01.2012
comment
Хорошо, я рад, что это помогло. В качестве альтернативы вы также можете использовать preceding-sibling::* | following-sibling:*, но это немного более длинный тип. Было бы неплохо иметь ось sibling, которая объединяет как предшествующих, так и последующих братьев и сестер. twitter.com/#!/avernet/status/162904972319662080 - person avernet; 28.01.2012