如何保留最新的三个setter值

时间:2014-06-06 13:30:48

标签: java xpages

我正在维护一个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>

3 个答案:

答案 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的选项卡中。渲染后,他们会得到像

这样的id
  • ID = “视图:_id1:ContracttabbedPanel:tab_baseline:_id3:editBudgetCode”
  • ID = “视图:_id1:ContracttabbedPanel:tab_planned:_id4:editBudgetCode”
  • ID = “视图:_id1:ContracttabbedPanel:tab_actual:_id5:editBudgetCode”

我们可以使用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或来自对象的其他唯一值。