Xpages 如何获取重复控件中第n个编辑框的值?

Xpages 如何获取重复控件中第n个编辑框的值?,xpages,Xpages,我有一个重复控件中的EditBox控件。其迭代公式为: return 5; 它成功显示4个编辑框,起始索引设置为1 在SSJS中,如何获取第n个编辑框的值?您可以在编辑框的onchange事件上设置sessionScope变量或任何范围变量,然后在SSJS中引用sessionScope变量。下面是一些示例代码,底部的一位只是在页面上显示sessionScope变量 <?xml version="1.0" encoding="UTF-8"?> 您可以在编辑框的onchange事件上

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

return 5;
它成功显示4个编辑框,起始索引设置为1


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

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

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

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

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

当您将提交添加到onChange事件时,您创建了一个相当健谈的应用程序—可能会让您感到厌烦。设置焦点的解决方案大不相同。第一:focus是一个客户端操作,因此您需要一个客户端脚本,它“知道什么是第一个失败的控件”。好消息是:XPages将属性aria invalid=true添加到服务器端验证失败的所有字段中。 因此,您可以使用一个dojo.onLoad脚本来查询并将焦点设置为结果的第一个成员。另见 对于查询语法:

当您将提交添加到onChange事件时,您创建了一个相当健谈的应用程序-可能会咬到您。设置焦点的解决方案大不相同。第一:focus是一个客户端操作,因此您需要一个客户端脚本,它“知道什么是第一个失败的控件”。好消息是:XPages将属性aria invalid=true添加到服务器端验证失败的所有字段中。 因此,您可以使用一个dojo.onLoad脚本来查询并将焦点设置为结果的第一个成员。另见 对于查询语法:
至少可以说,重复是很有趣的。如果您查看teamroom模板mobileThread自定义控件中的示例,您将看到一个显示回复列表的重复,您还将注意到许多javascript与此一起使用,例如,单击一个按钮运行脚本将在重复中的所有按钮上运行

如果您正在寻找验证问题,stwissel的解决方案看起来是最好的。如果这是其他内容,并且在某个时候您只需要任何给定编辑框的值,那么您可能应该考虑以下内容:

var domEl = dojo.byId(' <repeatControlId> ');
var textBoxes = domEl.getElementsByTagName("input");
var certainValue = textBoxes[3].value;
现在,certainValue包含给定编辑框的值


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

至少可以说,重复是很有趣的。如果您查看teamroom模板mobileThread自定义控件中的示例,您将看到一个显示回复列表的重复,您还将注意到许多javascript与此一起使用,例如,单击一个按钮运行脚本将在重复中的所有按钮上运行

如果您正在寻找验证问题,stwissel的解决方案看起来是最好的。如果这是其他内容,并且在某个时候您只需要任何给定编辑框的值,那么您可能应该考虑以下内容:

var domEl = dojo.byId(' <repeatControlId> ');
var textBoxes = domEl.getElementsByTagName("input");
var certainValue = textBoxes[3].value;
现在,certainValue包含给定编辑框的值


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

添加了另一条注释,以便我可以添加代码

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

<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>

添加了另一条注释,以便我可以添加代码

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

<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>

是的,在同一个xPage上有多个自定义控件,我们也遇到过类似的问题。我真正想做的是访问控件本身,以便在验证失败时设置焦点。我认为这应该可以做到,因为您可以在html源代码中每个编辑框的id中看到一个索引号。另一个问题上的一个想法是使用动态id名称,但我还没有弄明白。不幸的是,我不知道有什么方法可以动态设置id。。不确定这是否可行。不要将会话范围用于此类事情。请使用正确的范围。对于重复编辑框,viewscope应该是要使用的范围。您是否注意到,如果您单击一个字段,然后单击地址栏,onchange事件不会被触发?是的,在同一xPage上有多个自定义控件,您也遇到过类似的问题。我真正想做的是访问控件本身,以便在验证失败时设置焦点。我认为这应该可以做到,因为您可以在html源代码中每个编辑框的id中看到一个索引号。关于另一个问题的一个想法是使用一个动态id名称,但我还没有弄明白,我不知道有什么方法可以动态设置id
泰利。。不确定这是否可行。不要将会话范围用于此类事情。请使用正确的范围。对于重复编辑框,viewscope应该是要使用的范围。您是否注意到,如果单击某个字段,然后单击地址栏,则不会触发onchange事件?这看起来很有希望。但这似乎是客户端?我需要服务器端。这是模板中的代码还是您提出的?我似乎无法让它工作。我认为这行var certainValue=textboxs[3].value;导致“未定义”为null或不是对象的。我的repeat控件的id为repeat1,因此我有var domEl=dojo.byId'repeat1';不,这是客户端,我的想法是这可以在客户端运行并传递到服务器。我不知道您的用例,但隐藏的输入框、executeOnServer函数、jsonRpcService可能会控制这些方面的内容。不,这是我当场编造的,是的,你的问题是dojo.byId是一个客户端函数,repeat的客户端id不是“repeat1”,例如视图:panel_34:repeat1。所以使用dojo.byId'{id:repeat1}';获得完整的客户ID,谢谢!好的,我更接近了,但是我对alertValue 1=+文本框[1]没有定义;警报框显示值1=未定义。对不起,我是个新手这看起来很有希望。但这似乎是客户端?我需要服务器端。这是模板中的代码还是您提出的?我似乎无法让它工作。我认为这行var certainValue=textboxs[3].value;导致“未定义”为null或不是对象的。我的repeat控件的id为repeat1,因此我有var domEl=dojo.byId'repeat1';不,这是客户端,我的想法是这可以在客户端运行并传递到服务器。我不知道您的用例,但隐藏的输入框、executeOnServer函数、jsonRpcService可能会控制这些方面的内容。不,这是我当场编造的,是的,你的问题是dojo.byId是一个客户端函数,repeat的客户端id不是“repeat1”,例如视图:panel_34:repeat1。所以使用dojo.byId'{id:repeat1}';获得完整的客户ID,谢谢!好的,我更接近了,但是我对alertValue 1=+文本框[1]没有定义;警报框显示值1=未定义。对不起,我是个新手是的,我也是。不知道我做错了什么。您甚至不必声明该数组。简单回报4;很好用。谢谢你的帮助。没问题,我会在可能的时候寻找问题,所以如果有其他问题,我会在附近。不要羞于把任何事情都列为最佳答案——当我试图回答更多问题时,声誉分数看起来不错-是的,我也是。不知道我做错了什么。您甚至不必声明该数组。简单回报4;很好用。谢谢你的帮助。没问题,我会在可能的时候寻找问题,所以如果有其他问题,我会在附近。不要羞于把任何事情都列为最佳答案——当我试图回答更多问题时,声誉分数看起来不错-