具有默认值的重复控件中的编辑框不会在删除时更新
Edit box in repeat control with default value does not update on delete
我有一个 Repeat 控件,其中有一个编辑框,它已通过默认设置 value.There 是一个用于删除该行的删除按钮。
只是为了测试我使用了计算字段和编辑 box.Computed 字段也传递了与编辑相同的值 box.Now 计算字段和编辑框都具有相同的值,当我点击在随机删除按钮上,它会被删除,但只有计算字段在删除的地方在重复控件中正确更新,
编辑框显示最后一条记录消失。
所以问题是,编辑框中的值没有像计算字段那样得到更新 does.I 已经通过编写以下代码完成了测试。
<?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:真实场景
我们申请了 select 多个会议日期,因此我们使用笔记空闲时间标记多个日期,然后允许用户 edit/delete 在另一个 [=41= ..因为 possible/feasible 不足以保存 SSJS 中的所有字段,我们宁愿通过使用自定义控件的自定义属性将每个字段与重复控件下的 data-source 绑定(希望我我说得有道理)。每个字段都映射为@chintan 指出如下:
dataSource[compositeData.to]
如问题第一部分所述,字段没有更新,因为我们使用默认值设置它们。然而,根据我们的建议,我们尝试使用脚本库来设置字段,该脚本库运行良好,但可能看起来很愚蠢,但它会弄乱日期字段。当我们使用以下设置值时:
var d:java.util.Date = new java.util.Date(compositeData.selectedDate);
getComponent("from").setValue(d);
它混淆了月份、日期和年份字段并显示完全不同的值(相同的代码在作为默认值时效果很好)。
希望这是有道理的。
任何一种解决方案都将受到赞赏。
inputText2 的 defaultValue
仅在第一个页面加载时执行一次。然后XPage记忆repeat 1有inputText2 defaultValue
1,repeat 2有inputText2 defaultValue
2等等。
示例:正如您在打印日志中看到的,inputText2 的 defaultValue
在删除第 3 行和之后的第 1 行后不会再次计算。
反过来,在label1的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 变量。
正如您在 "Edit 1 Real Scenario" 中所述,您想要编辑和删除日期对。我创建了以下示例。为了简单起见,我只使用字符串而不是日期。将日期保存在 viewScope 变量中,edit/delete 它们就在那里:
<?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 变量创建为对象数组。
我有一个 Repeat 控件,其中有一个编辑框,它已通过默认设置 value.There 是一个用于删除该行的删除按钮。
只是为了测试我使用了计算字段和编辑 box.Computed 字段也传递了与编辑相同的值 box.Now 计算字段和编辑框都具有相同的值,当我点击在随机删除按钮上,它会被删除,但只有计算字段在删除的地方在重复控件中正确更新,
编辑框显示最后一条记录消失。 所以问题是,编辑框中的值没有像计算字段那样得到更新 does.I 已经通过编写以下代码完成了测试。
<?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:真实场景
我们申请了 select 多个会议日期,因此我们使用笔记空闲时间标记多个日期,然后允许用户 edit/delete 在另一个 [=41= ..因为 possible/feasible 不足以保存 SSJS 中的所有字段,我们宁愿通过使用自定义控件的自定义属性将每个字段与重复控件下的 data-source 绑定(希望我我说得有道理)。每个字段都映射为@chintan 指出如下:
dataSource[compositeData.to]
如问题第一部分所述,字段没有更新,因为我们使用默认值设置它们。然而,根据我们的建议,我们尝试使用脚本库来设置字段,该脚本库运行良好,但可能看起来很愚蠢,但它会弄乱日期字段。当我们使用以下设置值时:
var d:java.util.Date = new java.util.Date(compositeData.selectedDate);
getComponent("from").setValue(d);
它混淆了月份、日期和年份字段并显示完全不同的值(相同的代码在作为默认值时效果很好)。
希望这是有道理的。
任何一种解决方案都将受到赞赏。
inputText2 的 defaultValue
仅在第一个页面加载时执行一次。然后XPage记忆repeat 1有inputText2 defaultValue
1,repeat 2有inputText2 defaultValue
2等等。
示例:正如您在打印日志中看到的,inputText2 的 defaultValue
在删除第 3 行和之后的第 1 行后不会再次计算。
反过来,在label1的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 变量。
正如您在 "Edit 1 Real Scenario" 中所述,您想要编辑和删除日期对。我创建了以下示例。为了简单起见,我只使用字符串而不是日期。将日期保存在 viewScope 变量中,edit/delete 它们就在那里:
<?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 变量创建为对象数组。