2012-04-04 41 views

回答

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

是在一个类似的问题上,在同一个x页面上的多个自定义控件。我真正想要做的就是去控制自己,所以如果验证失败,我可以设置焦点。我认为这应该能够完成,因为你可以在HTML源代码中的每个编辑框中看到一个“索引”编号。关于其他问题的一个想法是使用“动态”ID名称,但我一直无法弄清楚。 – 2012-04-04 21:06:40

+0

我不知道有什么办法来动态设置ID不幸的是..不知道这是可能的。 – 2012-04-05 00:06:55

+1

不要使用会话范围这种事情。请使用正确的范围。对于重复的编辑框,Viewscope应该是使用的范围。 – jjtbsomhorst 2012-04-05 07:01:12

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

1

重复是很有趣的事情,至少可以说。如果您查看团队室模板mobileThread自定义控件中的示例,您会看到重复显示回复列表,您还会注意到很多JavaScript都会与之配合使用,例如,一个按钮单击时运行脚本会运行在重复中的所有按钮上。

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

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

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

还没有尝试过这一点,可能需要一点调整,但一般的想法应该工作,我会想。

+0

这看起来很有希望。但这似乎是客户端?我需要服务器端。这是在模板中找到的代码还是你想出的东西?我似乎无法得到它的工作。我认为这行var certainValue = textBoxes [3] .value;导致'未定义'为空或不是对象。我的重复控件有一个repeat1的id,所以我有var domEl = dojo.byId('repeat1'); – 2012-04-05 12:53:48

+0

不,这是客户端,我的想法是可以在客户端运行并传递到服务器。我不知道你的用例,但隐藏的输入框,executeOnServer()函数,jsonRpcService控制这些行的东西也许。不,这是我现场编造的东西,是的,您的问题是,dojo.byId是客户端功能,重复的客户端ID不是'repeat1',例如。视图:panel_34:repeat1。所以使用dojo.byId('#{id:repeat1}');获取完整的客户端ID – 2012-04-05 13:30:19

+0

谢谢!好吧,我更接近,但我得到了未定义的警报(“价值1 =”+ textBoxes [1]);警告框显示值1 =未定义。对不起,这样的新人。 :) – 2012-04-05 13:43:39

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

也适用于我。不知道我做错了什么。你甚至不需要声明该数组。简单的返回4;工作得很好。谢谢您的帮助。 – 2012-04-05 16:59:15

+0

没有概率,我会在可以的时候寻找问题,这样如果有其他事情发生,我会在身边。当我试图回答更多信息时,不要羞于将任何标记作为顶级答案,信誉点看起来不错;-) – 2012-04-05 18:40:11