4

我有一个重复控件,其中有一个已传递默认值的编辑框。有一个删除按钮可以删除该行。

只是为了测试,我使用了一个计算字段和编辑框。计算字段也传递了与编辑框相同的值。现在计算字段和编辑框都有相同的值,当我随机单击删除按钮时,它会被删除,但是仅计算字段在重复控制中正确更新,无论何时删除,

在编辑框的情况下,它显示最后一条记录消失。所以问题是,编辑框中的值不会像计算字段那样得到更新。我已经通过编写以下代码完成了测试。

 <?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);

它混淆了月份、日期和年份字段,并显示了一个完全不同的值(相同的代码在作为默认值时效果很好)。

希望这是有道理的。

可以欣赏任何类型的解决方案。

4

2 回答 2

2

inputText2defaultValue在第一页加载时只执行一次。然后XPage 记住repeat 1 有inputText2 defaultValue1,repeat 2 有inputText2 defaultValue2 等等。

在此处输入图像描述

示例:正如您在打印日志中看到的defaultValue那样,在删除第 3 行和之后的第 1 行后,不会再次计算 inputText2。

把它转过来,在 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 变量。

于 2015-05-16T09:12:52.380 回答
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 变量创建为对象数组。

于 2015-05-16T12:10:25.220 回答