Xpages 使用一个保存操作保存多个重复

Xpages 使用一个保存操作保存多个重复,xpages,xpages-ssjs,Xpages,Xpages Ssjs,我的XPage上有一个repeat控件。我根据用户选择的内容构建重复。重复控件可以有1到10个项目。每次重复都会创建新文档 是否有一种方法可以让一个保存按钮保存每次重复,而不是在每次重复中都有一个单独的保存按钮 <?xml version="1.0" encoding="UTF-8"?> <xp:view xmlns:xp="http://www.ibm.com/xsp/core"> <xp:repeat id="repeat1"

我的XPage上有一个repeat控件。我根据用户选择的内容构建重复。重复控件可以有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>

我强烈建议阅读一些关于数据绑定到JavaBean的内容


它将帮助您从页面的各个位置收集数据(在本例中重复),您只需实现
save()
方法即可将数据保存在单个按钮上,但要保存到多个文档中。

我强烈建议您阅读一些关于数据绑定到Java Bean的内容


它将帮助您从页面上的各个位置收集数据(在本例中重复),您只需实现
save()
方法即可将数据保存在单个按钮上,但要保存到多个文档中。

我相信有一个简单的按钮操作称为“保存数据源”或类似操作。这将一次性保存XPage上存在的所有数据源

或者,将repeat控件包装在面板中。然后使用如下SSJS:

var c = getComponent("mypanel");
var ds = c.getData();
获取该面板的数据源列表。 我知道数据源对象有一个“刷新”方法,我假设它也有一个“保存”方法。因此,您可以使用for…next循环遍历数据源列表,并执行每个数据源的save方法


有关刷新方法的示例,请参见

我相信有一个简单的按钮操作叫做“保存数据源”或类似的操作。这将一次性保存XPage上存在的所有数据源

或者,将repeat控件包装在面板中。然后使用如下SSJS:

var c = getComponent("mypanel");
var ds = c.getData();
获取该面板的数据源列表。 我知道数据源对象有一个“刷新”方法,我假设它也有一个“保存”方法。因此,您可以使用for…next循环遍历数据源列表,并执行每个数据源的save方法


有关刷新方法的示例,请参见

将stackoverflow answer()中的一些csj与远程服务SSJS调用结合起来,得出了下面的结果,我认为这正是您想要的。但正如Frantisek所说,使用JavaBeans可能是一个更好的解决方案

下面的XPage有一个简单的重复,显示3个不同值的输入。单击“Master Save”按钮将使用CSJS拉出repeat中所有输入文本框的值,然后调用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>

将stackoverflow answer()中的一些CSJ与一个远程服务SSJS调用结合起来,得出了下面的结果,我认为这正是您想要的。但正如Frantisek所说,使用JavaBeans可能是一个更好的解决方案

下面的XPage有一个简单的重复,显示3个不同值的输入。单击“Master Save”按钮将使用CSJS拉出repeat中所有输入文本框的值,然后调用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>


如果您可以提供一个代码示例,那么代码示例将非常有用?如果您的“保存”按钮是“提交”按钮,位于页面上的“重复”按钮之外,则应立即保存所有数据源。嗨,Brian,我已使用代码示例更新了我的问题。我的重复没有绑定到数据源,因为我需要在保存时创建多个文档。我有办法做到这一点吗?谢谢你的帮助。@RyanBuening只是想澄清一下:重复不会保存。您希望保存绑定到后端文档的值(通过重复呈现)。但您的绑定无法工作:它绑定到行值,行值从常量重复,因此它是“只读的”。如果您可以提供一个代码示例,那么代码示例会很有用吗?如果您的“保存”按钮是“提交”按钮,位于页面上的“重复”按钮之外,则应立即保存所有数据源。嗨,Brian,我已使用代码示例更新了我的问题。我的重复没有绑定到数据源,因为我需要在保存时创建多个文档。我有办法做到这一点吗?谢谢你的帮助。@RyanBuening只是想澄清一下:重复不会保存。您希望保存绑定到后端文档的值(通过重复呈现)。但您的绑定无法工作:它绑定到行值,行值从常量重复,因此它是“只读”的。谢谢,Brian。我认为这将暂时奏效。我将查看一个未来的JavaBeans解决方案。谢谢,Brian。我认为这将暂时奏效。我将查看一个未来的JavaBeans解决方案。感谢您提供的资源。我将在未来对此进行调查。感谢您提供的资源。我将在未来对此进行调查。