Сохранение нескольких повторов с помощью одного действия сохранения

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

Есть ли способ иметь одну кнопку сохранения, которая сохраняет каждый повтор, а не отдельную кнопку сохранения в каждом?

<?xml version="1.0" encoding="UTF-8"?>
<xp:view
    xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:repeat
        id="repeat1"
        rows="30"
        var="rowData"
        indexVar="rowIndex">
        <xp:this.value><![CDATA[#{javascript:["1","2","3"]}]]></xp:this.value>
        <xp:inputText
            id="Number"
            defaultValue="#{javascript:rowData}" />
        <xp:button
            value="Save"
            id="button1">
            <xp:eventHandler
                event="onclick"
                submit="true"
                refreshMode="complete">
                <xp:this.action><![CDATA[#{javascript:var doc = database.createDocument();
doc.appendItemValue("Form","PersonDoc");
doc.save();

var doc2 = database.createDocument();
doc2.appendItemValue("Form", "PlaceDoc"); // I need the ability to create multiple documents
doc2.save();}]]></xp:this.action>
            </xp:eventHandler>
        </xp:button>
        <xp:br />
    </xp:repeat>
    <xp:br />
    <xp:button
        value="Master Save"
        id="button2" />
    <xp:label
        id="label1">
        <xp:this.value><![CDATA[<-- Able to call save once here instead of having to save 3 individual times in repeat?]]></xp:this.value>
    </xp:label>
</xp:view>

person Ryan Buening    schedule 31.03.2014    source источник
comment
Пример кода был бы полезен, если бы вы могли его предоставить? Если ваша кнопка сохранения представляет собой кнопку отправки, расположенную за пределами повторов на странице, она должна сохранять все источники данных одновременно.   -  person Brian Gleeson - IBM    schedule 31.03.2014
comment
Привет Брайан, я обновил свой вопрос с образцом кода. Мой повтор не привязан к источнику данных, так как мне нужно создать несколько документов при сохранении. Есть ли способ сделать это? Спасибо за любую помощь.   -  person Ryan Buening    schedule 31.03.2014
comment
@RyanBuening Просто чтобы уточнить: повторы не сохраняются. Вы хотите сохранить значения (отображенные путем повторения), привязанные к внутреннему документу. Но ваша привязка не может работать: она привязывается к значению строки, которое повторяется из константы, поэтому оно доступно только для чтения.   -  person Frantisek Kossuth    schedule 31.03.2014


Ответы (3)


Объединил некоторые CSJS из этого ответа stackoverflow (https://stackoverflow.com/a/10031076) с вызовом удаленной службы SSJS и придумал ниже, что, я думаю, делает то, что вы хотите. Но, как сказал Франтишек, использование Java bean-компонентов может быть лучшим решением.

XPage ниже имеет простой повтор, отображающий 3 входа с разными значениями. При нажатии кнопки «Основное сохранение» будут извлечены значения всех входных текстовых полей в повторении с использованием CSJS, а затем сделан вызов jsonRpcService для запуска SSJS, который создает документы. В качестве примера я добавил строки для перекачки входных значений в сохраненные документы.

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xe="http://www.ibm.com/xsp/coreex">
<xp:repeat id="repeat1" rows="30" var="rowData" indexVar="rowIndex">
    <xp:this.value><![CDATA[#{javascript:["1","2","3"]}]]></xp:this.value>
    <xp:inputText id="Number" defaultValue="#{javascript:rowData}" />
</xp:repeat>
<xp:br />

<xp:button id="masterSave3" value="Master Save">
    <xp:eventHandler event="onclick" submit="false">
        <xp:this.script><![CDATA[
            var domEl = dojo.byId('#{id:repeat1}');

            //Get array of input textboxes
            var textBoxes = domEl.getElementsByTagName("input");

            //Pull out values of the textBoxes
            var valueList = [];
            for(var i = 0; i < textBoxes.length; i++) {
                valueList[i] = textBoxes[i].value;
            }

            //Call the remote service that runs SSJS, passing in array of values
            var deferred = masterSaveSvc.saveMethod(valueList);
            deferred.addCallback(function(result) {
                //Optional, display an alert upon completion, or perform some other code
                alert(result);
            });
        ]]>
        </xp:this.script>
    </xp:eventHandler>
</xp:button>

<xe:jsonRpcService id="jsonRpcService1" serviceName="masterSaveSvc">
    <xe:this.methods>
        <xe:remoteMethod name="saveMethod">
            <xe:this.arguments>
                <xe:remoteMethodArg name="valueList"></xe:remoteMethodArg>
            </xe:this.arguments>
            <xe:this.script><![CDATA[
                //For each entry in the array
                for(var i = 0; i < valueList.length; i++) {
                    //Create new document
                    var doc = database.createDocument();
                    doc.appendItemValue("Form", "PersonDoc");
                    //Add current value to the document
                    doc.appendItemValue("Name", valueList[i]);
                    doc.save();

                    //Create another new document
                    var doc2 = database.createDocument();
                    doc2.appendItemValue("Form", "PlaceDoc");
                    //Add current value to the document
                    doc2.appendItemValue("Place", valueList[i]);
                    doc2.save();

                    //Print values to the server console
                    println("value " + (i+1) + ": " + valueList[i]);
                }                       
                return "finished";
            ]]>
            </xe:this.script>
        </xe:remoteMethod>
    </xe:this.methods>
</xe:jsonRpcService>
</xp:view>
person Brian Gleeson - IBM    schedule 02.04.2014
comment
Спасибо, Брайан. Я думаю, что это будет работать на данный момент. Я собираюсь проверить решение Java beans на будущее. - person Ryan Buening; 02.04.2014

Я настоятельно рекомендую прочитать что-нибудь о привязке данных к Java bean-компонентам.

http://www.mindoo.com/web/blog.nsf/dx/22.07.2009175255KLELM7.htm

http://www.mindoo.com/web/blog.nsf/dx/22.07.2009175255KLELM7.htm

Это поможет вам собирать данные из разных мест на странице (повторяется в нашем случае), и вам нужно просто реализовать метод save() для сохранения ваших данных на одной кнопке, но во многих документах.

person Frantisek Kossuth    schedule 31.03.2014
comment
Спасибо за ресурсы. Я собираюсь изучить это на будущее. - person Ryan Buening; 02.04.2014

Я считаю, что есть простое действие для кнопок под названием «сохранить источники данных» или подобное. Это должно сохранить все источники данных, которые существуют на XPage одновременно.

В качестве альтернативы поместите элемент управления повтором внутрь панели. Затем используйте SSJS следующим образом:

var c = getComponent("mypanel");
var ds = c.getData();

чтобы получить список источников данных этой панели. Я знаю, что объект источника данных имеет метод «обновления», и я предполагаю, что у него также есть метод «сохранения». Таким образом, вы можете просмотреть список источников данных с помощью цикла for...next и выполнить метод сохранения каждого источника данных.

См. http://xpageswiki.com/web/youatnotes/wiki-xpages.nsf/dx/Work_with_datasources#Reset+%2F+clear+a+datasource для примера относительно метода обновления.

person Julian Buss    schedule 31.03.2014