Xpages Teamstudio未插入:添加更多表行而不进行部分刷新

Xpages Teamstudio未插入:添加更多表行而不进行部分刷新,xpages,teamstudio-unplugged,Xpages,Teamstudio Unplugged,我正在使用Teamstudio Unlocked尝试扩展一个表行,其中inputExt绑定到一个文档 此表的功能是让用户写下观察结果,然后描述观察结果 在此之后,用户应该能够按下一个按钮,并获得另一行,以便他可以添加另一个观察 我无法部分刷新整个表,因为这会导致InputExt重新加载绑定到它们的值 我无法部分刷新新行并使用服务器端脚本更改其styleclass,因为ID不会从设计器继承。 这意味着在设计器中:成为pc模拟器中的: 所以我不能用计算样式类和部分刷新来解决这个问题。因此,我现在已经

我正在使用Teamstudio Unlocked尝试扩展一个表行,其中inputExt绑定到一个文档

此表的功能是让用户写下观察结果,然后描述观察结果

在此之后,用户应该能够按下一个按钮,并获得另一行,以便他可以添加另一个观察

我无法部分刷新整个表,因为这会导致InputExt重新加载绑定到它们的值

我无法部分刷新新行并使用服务器端脚本更改其styleclass,因为ID不会从设计器继承。 这意味着在设计器中:
成为pc模拟器中的:
所以我不能用计算样式类和部分刷新来解决这个问题。因此,我现在已经建立了一个按钮,包括下面,但它只改变工作两次。在此之后,onclick字符串永远不会更改


与您的另一个问题一样,我也倾向于在客户端执行此操作,而不是尝试进行部分刷新。只需使用jQuery将行添加到表中,然后在保存文档时将每行的值存储到隐藏的列表字段中


同样,对于您想要使用的ID,不要依赖服务器生成的ID,而是添加您自己的属性,并使用这些属性选择项目。

这可以通过使用标准(-ish)XPages技术来完成,这对于任何不熟悉JQuery的人来说可能更容易。 我从不建议使用表格进行布局,使用
和或
标记并使用CSS。然而,为了回答这个特定的问题,我使用了一张桌子(现在从肥皂盒上爬下来)

所以我假设每一行中的数据都在同一个文档中。如果是这样,并且用户一次只写一个观察,为什么不使用完全刷新?所有的事情都是在不插电源的情况下在客户端完成的(即使是服务器部件——如果有意义的话),所以速度很快。此方法显示现有观察结果(如果适用),并允许用户一次输入多行:

在表单上添加一个隐藏字段-NoOfObservations-这可以是一个文本字段,并将用作XPage中的索引

将XPage上的数据源添加到表单

创建beforePageLoad事件以根据现有文档或新文档设置索引:

<xp:this.beforePageLoad><![CDATA[#{javascript:
var ObservationCount = 0;
if(!document1.isNewNote()){
ObservationCount = document1.getItemValue("NoOfObservations")[0];
}
sessionScope.put("observations", ObservationCount);
}]]>
</xp:this.beforePageLoad>

使用现有行创建表-使用xp:repeat控件和sessionScope中的索引生成行-为新条目添加两行新行:

<table>
    <xp:repeat id="repeat1" rows="30" var="rowData"
        indexVar="dataRows">
        <xp:this.value><![CDATA[#{javascript:sessionScope.get("observations");}]]></xp:this.value>
        <tr>
            <td>
                <xp:label value="Observation" id="label1"
                    style="color:rgb(255,255,255)">
                </xp:label>
            </td>
            <td>
                <xp:text escape="true" id="computedField1">
                    <xp:this.value><![CDATA[#{javascript:return document1.getItemValueString("ObservationTitle" + dataRows);}]]></xp:this.value>
                </xp:text>
            </td>
        </tr>
        <tr>
            <td>
                <xp:label value="Details" id="label2"
                    style="color:rgb(255,255,255)">
                </xp:label>
            </td>
            <td>
                <xp:text escape="true" id="computedField2">
                    <xp:this.value><![CDATA[#{javascript:return document1.getItemValueString("ObservationDesc" + dataRows);}]]></xp:this.value>
                </xp:text>
            </td>
        </tr>
    </xp:repeat>
    <tr>
        <td>
            <xp:label value="New Observation"
                id="newObservationTitle" style="color:rgb(255,255,255)">
            </xp:label>
        </td>
        <td>
            <xp:inputText id="inputText1"></xp:inputText>
        </td>
    </tr>
    <tr>
        <td>
            <xp:label value="New Description"
                id="newObservationDesc" style="color:rgb(255,255,255)">
            </xp:label>
        </td>
        <td>
            <xp:inputTextarea id="inputTextarea1"></xp:inputTextarea>
        </td>
    </tr>
</table>

在onClick事件中使用带有以下SSJ的xp:按钮:

<xp:button value="Save" id="button1">
    <xp:eventHandler event="onclick" submit="true"
        refreshMode="complete">
        <xp:this.action>
            <xp:actionGroup>
                <xp:executeScript>
                    <xp:this.script><![CDATA[#{javascript:
var newObservation = parseInt(sessionScope.get("observations")) +1;
document1.replaceItemValue("ObservationTitle" + newObservation,  getComponent("inputText1").getValue());
document1.replaceItemValue("ObservationDesc" + newObservation, getComponent("inputTextarea1").getValue());
document1.replaceItemValue("NoOfObservations", newObservation);
document1.save();}]]></xp:this.script>
                </xp:executeScript>
                <xp:openPage name="/UnpMain.xsp"></xp:openPage>
            </xp:actionGroup>
        </xp:this.action>
    </xp:eventHandler>
</xp:button>