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

时间:2017-05-05 10:17:56

标签: xpages repeat xpages-ssjs

每次需要新目标时,我需要在一行中创建3个字段。 objective1,midYear1,endYear1。然后,如果我添加一个目标,objective2,midYear2,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 个答案:

答案 0 :(得分:0)

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

为Notes客户端/传统Domino Web构建这一点在历史上是一个巨大的痛苦,因为限制是您无法在同一UI中轻松编辑多个文档,因为Form既是存储架构,也是UI的设计

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

因此,我首选的方法是将存储结构分解为更细粒度的元素。所以每个目标都是它自己的文档,固定绑定到“objective”,“midYear”,“endYear”。

然后有多种方法可用于创建新条目。一个是顶部的单个固定行,带有scope="request" ignoreRequestParams="true"的dominoDocument数据源。然后保存可以将NoteID / UNID添加到重复,然后从相关文档中检索值以进行显示/编辑。

更高级的方法是使viewScope变量具有附加选项(在开头或结尾),然后计算重复内的dominoDocument数据源以检索相关文档(即action="openDocument")或创建一个新的(即action="newDocument")。