我有一个Repeat控件,其中我有一个已经传递了默认值的编辑框。有一个删除按钮来删除该行。
仅用于测试我使用了计算字段和编辑框。计算字段也传递与编辑框相同的值。现在计算字段和编辑框具有相同的值,当我随机单击删除按钮时,它获取删除,但只有在删除的地方重复控制时才能正确计算字段更新,
如果是编辑框,则显示最后一条记录消失。 所以问题是,编辑框中的值不像计算字段那样得到更新。我已经通过编写以下代码完成了测试。
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:this.data>
<xp:dominoDocument var="document1" formName="testing">
</xp:dominoDocument>
</xp:this.data>
<xp:inputText id="inputText1" multipleSeparator=",">
<xp:this.defaultValue><![CDATA[#{javascript:var v:java.util.Vector = new java.util.Vector();
v.add('1');v.add('2');v.add('3');v.add('4');v.add('5');v.add('6');
return v;}]]></xp:this.defaultValue>
</xp:inputText>
<xp:br></xp:br>
<xp:repeat id="repeat1" rows="30" var="r" indexVar="i" first="0">
<xp:this.value><![CDATA[#{javascript:return getComponent("inputText1").getValue();}]]></xp:this.value>
<xp:br></xp:br>
<xp:div style="text-align:center">
<xp:label value="#{javascript:r}" id="label1"
style="text-align:center">
</xp:label>
<xp:button value="Delete" id="button1">
<xp:eventHandler event="onclick" submit="true"
refreshMode="complete">
<xp:this.action><![CDATA[#{javascript:var v:java.util.Vector = getComponent("inputText1").getValue();
if(v != null){
var sdtString = getComponent("inputText2").getValue();
if(v.contains(sdtString))
v.remove(sdtString);
};}]]></xp:this.action>
</xp:eventHandler>
</xp:button>
<xp:inputText id="inputText2">
<xp:this.defaultValue><![CDATA[#{javascript:getComponent("label1").getValue();}]]></xp:this.defaultValue>
</xp:inputText>
</xp:div>
<xp:br></xp:br>
</xp:repeat>
</xp:view>
这是用于测试以获得确切问题的示例代码。
编辑1:真实场景
我们有一个应用程序为会议选择多个日期,因此使用笔记空闲时间我们标记多个日期,然后允许用户在另一个窗口中编辑/删除相同的日期。因为,它不可能/不够可行要保存SSJS中的所有字段,我们宁愿首选使用自定义控件的自定义属性将每个字段与重复控件下的数据源绑定(希望我有所帮助)。每个字段都映射为@chintan,如下所示:
dataSource[compositeData.to]
如问题的第一部分所述,字段未更新,因为我们使用默认值设置它们。但是,基于我们尝试使用脚本库设置该字段的建议,但是,它可能看起来很愚蠢,但它会混淆日期字段。当我们使用以下内容设置值时:
var d:java.util.Date = new java.util.Date(compositeData.selectedDate);
getComponent("from").setValue(d);
它会混淆月份,日期和年份字段并显示完全不同的值(相同的代码在作为默认值时效果很好)。
希望这是有道理的。
可以理解任何类型的解决方案。
答案 0 :(得分:2)
inputText2&#39; s defaultValue
仅在首页加载时执行一次。然后XPage记住重复1有inputText2 defaultValue
1,重复2有inputText2 defaultValue
2,依此类推。
示例:正如您在打印日志中看到的那样,输入文本2&#39; s defaultValue
在删除第3行及后续第1行后无法再次计算。
转过来并在label1&#39; value
代码中设置inputText2的值:
<xp:label
value="#{javascript:getComponent('inputText2').setValue(r); r}"
id="label1"
style="text-align:center">
</xp:label>
然后它将正确设置inputText2的值。您不再需要inputText2的defaultValue
属性。
作为替代方法,您可以定义inputText2的value
属性并将其绑定到特定于行的数据源或viewScope变量。
答案 1 :(得分:1)
正如您在“编辑1真实场景”中所述,您想要编辑和删除日期对。我创建了以下示例。为了简单起见,我只使用字符串而不是日期。将日期保存在viewScope变量中并在那里编辑/删除它们:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view
xmlns:xp="http://www.ibm.com/xsp/core">
<xp:this.beforePageLoad><![CDATA[#{javascript:viewScope.dates=[
{"from":"a", "to":"b"},
{"from":"c", "to":"d"},
{"from":"x", "to":"y"}];}]]></xp:this.beforePageLoad>
<xp:br />
<xp:repeat
id="repeat1"
rows="30"
var="r"
indexVar="i"
value="#{viewScope.dates}">
<xp:br></xp:br>
<xp:div>
<xp:button
value="Delete"
id="button1">
<xp:eventHandler
event="onclick"
submit="true"
refreshMode="complete">
<xp:this.action><![CDATA[#{javascript: viewScope.dates.remove(i);
}]]></xp:this.action>
</xp:eventHandler>
</xp:button>
<xp:inputText
id="inputText1"
value="#{r.from}">
</xp:inputText>
<xp:inputText
id="inputText2"
value="#{r.to}">
</xp:inputText>
<xp:button
value="Update"
id="button2">
<xp:eventHandler
event="onclick"
submit="true"
refreshMode="complete">
<xp:this.action><![CDATA[#{javascript: "";
}]]></xp:this.action>
</xp:eventHandler>
</xp:button>
</xp:div>
<xp:br></xp:br>
</xp:repeat>
<xp:text
escape="false"
id="computedField1">
<xp:this.value><![CDATA[#{javascript:
var length = viewScope.dates.length;
var result = "";
for (var i = 0; i < length; i++) {
result += viewScope.dates[i].from + " - " + viewScope.dates[i].to + "<br />";
}
result
}]]></xp:this.value>
</xp:text>
</xp:view>
将viewScope变量创建为对象数组。