Xpages重复控制&;动态字段创建/显示

Xpages重复控制&;动态字段创建/显示,xpages,repeat,xpages-ssjs,Xpages,Repeat,Xpages Ssjs,每次需要新目标时,我需要在一行中创建3个字段。目标1,年中1,年底1。然后,如果我添加一个目标,objective2,middyear2,endYear2等等。第一次似乎一切都正常,但第二次却产生了大量的字段。我假设这就是我正确嵌套/不嵌套/使用重复的方式,因为我的viewScope变量都是正确的,所以它只是显示我自己感到困惑的字段。我只需要3个字段中的每一个都在一列中,然后换行并重复…下面的代码,但是如果有人有更好的方法,我也愿意接受建议。。。。。谢谢 <xp:this.data>

每次需要新目标时,我需要在一行中创建3个字段。目标1,年中1,年底1。然后,如果我添加一个目标,objective2,middyear2,endYear2等等。第一次似乎一切都正常,但第二次却产生了大量的字段。我假设这就是我正确嵌套/不嵌套/使用重复的方式,因为我的viewScope变量都是正确的,所以它只是显示我自己感到困惑的字段。我只需要3个字段中的每一个都在一列中,然后换行并重复…下面的代码,但是如果有人有更好的方法,我也愿意接受建议。。。。。谢谢

<xp:this.data>
<xp:dominoDocument
    var="document1"
    formName="objective">
</xp:dominoDocument>
</xp:this.data>


<xp:repeat id="repeat1" rows="100" value="#{viewScope.fields}"
    var="fieldName">
        <xp:repeat id="repeat2" rows="100" value="#{viewScope.fields2}"
    var="fieldName2">

        <xp:repeat id="repeat3" rows="100" value="#{viewScope.fields3}"
    var="fieldName3">

    <div class="row">

        <div class="col-xs-4">
            <xp:label value="#{fieldName}" for="inputText1">
            </xp:label>
            <xp:inputText id="inputText1">
                <xp:this.value><![CDATA[#{document1[fieldName]}]]></xp:this.value>
            </xp:inputText>
        </div>

        <div class="col-xs-4">
            <xp:label value="#{fieldName2}" for="inputText2">
            </xp:label>
            <xp:inputText id="inputText2">
                <xp:this.value><![CDATA[#{document1[fieldName2]}]]></xp:this.value>
            </xp:inputText>
        </div>


        <div class="col-xs-4">
            <xp:label value="#{fieldName3}" for="inputText3">
            </xp:label>
            <xp:inputText id="inputText3">
                <xp:this.value><![CDATA[#{document1[fieldName3]}]]></xp:this.value>
            </xp:inputText>
        </div>

    </div>
</xp:repeat>
            </xp:repeat>
    </xp:repeat>


<xp:button
value="Add Objective"
id="button1">
<xp:eventHandler event="onclick" submit="true" refreshMode="partial"
    refreshId="repeat1">
    <xp:this.action><![CDATA[#{javascript:
        if (!viewScope.fields) {
            viewScope.fields = [];
            viewScope.fields2 = [];
            viewScope.fields3 = [];
            var count:integer = 1;
        }         
        viewScope.fields.push("Objective" + (viewScope.fields.length + 1));
        viewScope.fields2.push("MidYear" +  (viewScope.fields2.length + 1));
        viewScope.fields3.push("EndYear" +  (viewScope.fields3.length + 1));
        count = count+1;

    }]]></xp:this.action>
</xp:eventHandler>


问题在于,通过嵌套,对于列1中的每个条目,您将创建列2的n个实例。然后,对于列中的每个条目,您将创建列3的n个实例。如果需要这种方法,最好创建一个viewScope变量,其中每个元素都有每个目标的字段名(作为对象或数组),然后使用单个viewScope变量重复一次

为Notes客户机/传统DominoWeb构建此表单在历史上是一个巨大的难题,因为限制是不能(轻松地)在同一UI中编辑多个文档,因为表单既是存储模式,也是UI设计

XPages意味着这不再是一个限制。XPage是UI,(dominoDocument/bean)数据源是存储模式

因此,我首选的方法是将存储结构分解为更细粒度的元素。因此,每个目标都是自己的文档,对“目标”、“年中”、“年终”有固定的绑定

然后有多种方法来创建新条目。一个是顶部的一个固定行,其dominoDocument数据源具有
scope=“request”ignoreRequestParams=“true”
。然后,Save可以将NoteID/UNID添加到repeat中,然后从相关文档检索要显示/编辑的值


更高级的方法是使用一个带有附加选项的viewScope变量(在开头或结尾),然后计算重复中的dominoDocument数据源,以检索相关文档(即
action=“openDocument”
)或创建一个新文档(即
action=“newDocument”
),使用这种方法,我是否需要打开每个要编辑/完成的文档/目标?要求是他们只需要一个文档,上面的所有字段都要填写/编辑,点击次数越少越好。。。。。。也许不是最好的方法,但他们想要什么……不一定,
action
属性可以计算为“editDocument”。这通常不是我的首选选项,因为这意味着许多文档同时以编辑模式打开,如果代码可以从不同的位置更新它们,这会增加冲突的风险。但这里的情况可能并非如此。或者,您可以创建一个小bean,直接与后端文档交互。由于所构建内容的简单性,我只在3列中的每列中创建了1个repeat,每个repeat绑定到viewScope变量中的一个字段数组。我还更新了一个viewScope变量来存储行数,并在保存时在文档上设置它,然后在页面加载之前使用它来预填充viewScope变量。我现在可以动态添加/删除字段,而无需做太多工作。谢谢你的建议!