我正在维护一个XPages应用程序。有一个" ServiceCost"具有名为" BudgetCode"的字段的对象这在数据库中有一个相应的字段。我遇到的问题是界面有三个选项卡,每个选项卡显示ServiceCost对象值及其BudgetCode字段,当我在第一个选项卡中修改BudgetCode字段时,对象设置器" SetBudgetCode"被调用三次以上,并使用第二个和第三个选项卡中的旧值写入新值。我如何保持新价值?这就是我如何保持值第一次调用" setBudgetCode" setter创建?
谢谢
以下是显示三个相关标签的标签控制器;
<xe:djTabContainer id="ContracttabbedPanel"
title="container" style="width: 100%;" persist="true"
tabPosition="top" doLayout="false"
rendered="#{ServiceSpendController.initialstagecomplete}">
<xe:djTabPane title="Baseline" id="tab_baseline">
<xc:ContractBaseline></xc:ContractBaseline>
</xe:djTabPane>
<xe:djTabPane title="Planned" id="tab_planned">
<xc:ContractPlanned></xc:ContractPlanned>
</xe:djTabPane>
<xe:djTabPane title="Actual" id="tab_actual">
<xc:ContractActual></xc:ContractActual>
</xe:djTabPane>
</xe:djTabContainer>
这是budgetCode字段的XPage代码;
<xp:inputText id="editBudgetCode" value="#{rowData.budgetCode}"
style="width:75.0px" required="true">
<xp:this.attrs>
<xp:attr name="triggeringhandlerid" value="btnsavehandlerid">
</xp:attr>
<xp:attr name="triggeringhandlerid" value="btnbaservicespendrecalculatehandler">
</xp:attr>
<xp:attr name="invalidstring" value="">
</xp:attr>
<xp:attr name="message"
value="Baseline Tab - Budget Code. This field cannot be null">
</xp:attr>
<xp:attr name="friendlyname" value="Budget Code">
</xp:attr>
<xp:attr name="insertfieldid" value="dspService">
</xp:attr>
<xp:attr name="tab" value="Baseline">
</xp:attr>
</xp:this.attrs>
<xp:this.converter>
<xp:converter converterId="SimpleString">
</xp:converter>
</xp:this.converter>
</xp:inputText>
答案 0 :(得分:0)
这应该有效:
public class Test {
private String value;
private String firstValue;
public void setValue(String value) {
this.value = value;
if (firstValue == null) {
firstValue = value;
}
}
}
您将第一个设定值保留在第二个变量中。
如果您只想允许一组(并避免下一组),您也可以使用:
public class Test {
private String value;
public void setValue(String value) {
if (this.value == null) {
this.value = value;
}
}
}
当然,在这段代码中,如果第一个集合给出一个空值,那么另一个集合中的值应该是错误的。但我认为,在你的情况下,这不应该发生。
无论如何,我认为你有设计问题。您最好不要将3个字段映射到相同的值以避免此类行为。 我给你的解决方案并不是很漂亮。但它会为您的设计问题提供快速解决方案。
答案 1 :(得分:0)
如果您有三个可编辑字段绑定到同一个基础字段,则所有三个字段都提供“新值”。一个应该是可编辑的,另外两个只是计算字段
答案 2 :(得分:0)
使用客户端上的 onchange 事件将新值/更改值设置为所有三个字段。然后,无论在哪个订单字段中保存回文档,您都会在提交后在文档中拥有正确的值。
<强>更新强>
您的编辑字段<xp:inputText id="editBudgetCode"
在嵌入式自定义控件的XPage中嵌入了三次 - 每个都位于djTabContainer的选项卡中。渲染后,他们会得到像
我们可以使用dojo.query("[id$=editBudgetCode]")
(=所有带有“editBudgetCode”结尾的id的元素)在客户端获取所有三个inputText元素并使用它们。
将以下代码添加到包含djTabContainer的XPage或自定义控件:
<xp:eventHandler
event="onClientLoad"
submit="false">
<xp:this.script><![CDATA[
dojo.query("[id$=editBudgetCode]").forEach(function(node) {
dojo.connect(node, "onchange", function() {
var newValue = this.value;
dojo.query("[id$=editBudgetCode]").forEach(function(node) {
node.value = newValue;
});
});
});]]>
</xp:this.script>
</xp:eventHandler>
它为每个budgetCode字段<xp:inputText id="editBudgetCode"...
设置onchange事件。当onchange事件被执行时,新的/更改的值将保存到“newValue”并放入所有三个字段。这样,所有三个字段都在客户端同步。提交页面后,您可以确保最后输入的字段值已保存。
更新2:
更进一步:如果字段绑定到相同的 Java对象,则只应对其进行同步。
在字段“editBudgetCode”
中添加其他属性“boundto”<xp:attr
name="boundto"
value="#{javascript: rowData.hashCode()}">
</xp:attr>
并扩展onchange函数:
<xp:eventHandler
event="onClientLoad"
submit="false">
<xp:this.script><![CDATA[
dojo.query("[id$=editBudgetCode]").forEach(function(node) {
dojo.connect(node, "onchange", function() {
var newValue = this.value;
var boundto = dojo.attr(this, "boundto");
dojo.query("[id$=editBudgetCode]").forEach(function(node) {
if (boundto === dojo.attr(node, "boundto")) {
node.value = newValue;
}
});
});
});]]>
</xp:this.script>
</xp:eventHandler>
.hashCode()
用于获取与Java对象不同的字符串。相反,您可以使用getter获取ID或来自对象的其他唯一值。