1

我在重复控件中有一个 EditBox 控件。其迭代公式为:

return 5;

它成功显示了 4 个编辑框(起始索引设置为 1)。

在 SSJS 中,如何获取第 n 个编辑框的值?

4

4 回答 4

2

您可以在编辑框的 onchange 事件上设置 sessionScope 变量(或任何范围变量),然后在您的 SSJS 中引用 sessionScope 变量。这是一些示例代码,底部仅显示页面上的 sessionScope 变量。

<?xml version="1.0" encoding="UTF-8"?>

<xp:repeat id="repeat1" rows="30" value="#{javascript:5}"
    indexVar="rptIndex">

    <xp:inputText id="inputText1">

    <xp:eventHandler event="onchange" submit="true" refreshMode="complete">
        <xp:this.action>
            <xp:executeScript>
                <xp:this.script><![CDATA[#{javascript:sessionScope['text'+rptIndex] = getComponent("inputText1").getValue()}]]></xp:this.script>
            </xp:executeScript>
        </xp:this.action></xp:eventHandler></xp:inputText>

</xp:repeat>



<xp:table styleClass="debug">
<xp:tr>
<th>Variable Name</th>
<th>Variable Content</th>
</xp:tr>
<xp:repeat id="varRepeat" rows="30" value="#{javascript:sessionScope.keySet();}" var="scopeData">
<xp:tr>
<xp:td>
<xp:text escape="true" id="varName" value="#{javascript:scopeData}" />
</xp:td>
<xp:td>
<xp:text escape="true" id="varValue" value="#{javascript:sessionScope.get(scopeData)}" />
</xp:td>
</xp:tr>
</xp:repeat>
</xp:table> 
</xp:view>
于 2012-04-04T19:48:30.850 回答
2

当您将提交添加到 onChange 事件时,您会创建一个相当健谈的应用程序 - 可能会咬到您。设置焦点的解决方案是相当不同的。第一:焦点是客户端操作,所以你需要一个客户端脚本'知道什么是第一个失败的控制。好消息:XPages 向所有未通过服务器端验证的字段添加属性 aria-invalid=true。因此,您可以使用 dojo.onLoad 脚本来查询该脚本并将焦点设置到结果的第一个成员。另请参阅http://dontpanic82.blogspot.com/2011/07/xpages-styling-invalid-field.html 查询语法: http ://dojotoolkit.org/reference-guide/1.7/dojo/query.html

于 2012-04-05T01:17:38.403 回答
1

至少可以说,重复处理很有趣。如果您查看 teamroom 模板 mobileThread 自定义控件中的示例,您会看到重复显示回复列表,您还会注意到很多 javascript 伴随着它,例如单击一个按钮运行脚本会运行在重复中的所有按钮上。

如果您正在寻找验证问题,stwissel 的解决方案看起来是最好的。如果这是别的东西,并且在某些时候您只需要任何给定编辑框的值,也许您应该考虑以下内容:

var domEl = dojo.byId(' <repeatControlId> ');
var textBoxes = domEl.getElementsByTagName("input");
var certainValue = textBoxes[3].value;

现在 certainValue 包含给定编辑框的值。

还没有尝试过,可能需要一些调整,但我认为总体思路应该可行。

于 2012-04-05T08:31:08.573 回答
1

添加了另一条评论,所以我可以添加代码。

进行了快速测试,对我来说效果很好,请参见下面的示例。希望能帮助到你。尝试添加一些打印输出,看看它是否得到了每一位。

<xp:repeat id="TestRepeat" rows="100" var="rowData"
    indexVar="commentIndex" first="0" rendered="true">
    <xp:this.value><![CDATA[#{javascript:
        var dataArray = new Array();
        dataArray.push(" Test");
        dataArray.push(" Test");
        dataArray.push(" Test");
        dataArray.push(" Test");
        dataArray.push(" Test");
        return dataArray;
    }]]></xp:this.value>

    <xp:panel>
        <xp:label value="Test"></xp:label>
        <xp:inputText id="inputText1" value="Test" defaultValue="Test">
        </xp:inputText>
        <xp:br></xp:br>
    </xp:panel>

</xp:repeat>

<xp:button value="Test" id="button1">
    <xp:eventHandler event="onclick" submit="false">
        <xp:this.script>
            <xp:executeClientScript>
                <xp:this.script><![CDATA[
                var domEl = dojo.byId('#{id:TestRepeat}');
                var textBoxes = domEl.getElementsByTagName("input");
                alert( "Value 1: " + textBoxes[0].value);
                ]]></xp:this.script>
            </xp:executeClientScript>
        </xp:this.script>
    </xp:eventHandler>
</xp:button>
于 2012-04-05T15:00:56.527 回答