使用日期选择器创建多值日期字段

Create a Multi-value date field using datepicker

我正在尝试使用日期选择器创建一个 MV 日期字段,我能得到的最接近的方法是使用日期选择器将日期存储在 viewScope 中,然后有一个按钮将日期添加到现有的 MV 日期字段。它(有点)有效,但似乎是一种非常尴尬的方式。做了一些搜索,找不到更好的东西。我在其中存储值的字段必须是可编辑的,以便在需要时可以删除值,但一点也不平滑。 有什么想法吗?

编辑 2015 年 8 月 21 日 接受了 Paul 的部分回答和我的部分解决方案,但我在数据输入方面遇到了一些问题。请参阅下面的代码——因为它工作正常并将日期列表存储在 viewScope.vsDates 如果您删除 // 并添加到行 viewScope.vsNames = tArray; //注释掉这一行和 运行 它在行 tArray.push(addDate) 失败的相同过程,错误消息 "Error in Add Date Error calling method 'push(java.util.Date)' on an object of type 'Date [JavaScript Object]'" 因此,一旦我从 WFSMainDoc.getValue("ExpPayDate") 中检索值,数据类型已更改但不确定如何绕过该部分。

<xp:panel id="panelAddDates">
        Additional Display Dates :
        <xp:table>
            <xp:tr>
                <xp:td valign="top">

                    <xp:inputText id="AddDate" value="#{viewScope.vsAddDate}">
                        <xp:dateTimeHelper id="dateTimeHelper3"></xp:dateTimeHelper>
                        <xp:this.converter>
                            <xp:convertDateTime type="date" dateStyle="medium">
                            </xp:convertDateTime>
                        </xp:this.converter>
                    </xp:inputText>
                </xp:td>
                <xp:td valign="top">
                    <xp:button value="Add to list" id="button2">
                        <xp:eventHandler event="onclick" submit="true"
                            refreshMode="partial" refreshId="panelAddDates">
                            <xp:this.action><![CDATA[#{javascript:try{
print("Start Transfer date");
var addDate:NotesDateTime = viewScope.vsAddDate;
print("Got addDate " + addDate);
//var expPayDate = WFSMainDoc.getValue("ExpPayDate");
var expPayDate = viewScope.vsDates;
    if (addDate != null){
        if (expPayDate == null || expPayDate == ""){
            print("expPayDate is null")
            var tArray:Array = new Array;
            tArray.push(addDate);
            //WFSMainDoc.setValue("ExpPayDate" , tArray)
            viewScope.vsDates = tArray
            print("ExpPayDate in WFSMainDoc = " + WFSMainDoc.getValue("ExpPayDate"))
            print("ExpPayDate in viewscope = " + viewScope.vsDates)
        }else{
            var tArray:Array = new Array;
            //tArray = WFSMainDoc.getValue("ExpPayDate");
            tArray = viewScope.vsDates;
            print("Got tArray = " + tArray.toString());
            tArray.push(addDate);
            //WFSMainDoc.setValue("ExpPayDate" , tArray);
            viewScope.vsNames = tArray; //comment out this line
            //print("ExpPayDate in WFSMainDoc = " + WFSMainDoc.getValue("ExpPayDate"));
            print("ExpPayDate in viewScope = " + viewScope.vsDates);
        }
        viewScope.remove("vsAddDate")
        print("Done")
    }
}catch(e){
    print("Error in Add Date " + e.toString())
}}]]></xp:this.action>
                        </xp:eventHandler>
                    </xp:button>
                </xp:td>
                <xp:td valign="top">

                <xe:djextListTextBox id="djextListTextBox1"
                    value="#{WFSMainDoc.ExpPayDate}" multipleSeparator=";">
                </xe:djextListTextBox>
                </xp:td>
            </xp:tr>
        </xp:table>
        </xp:panel><!-- panelAddDates -->

绑定到具有 onBlur 事件的 requestScope 变量的普通 DatePicker 如何将字段添加到数据源的字段,刷新相关组件(见下一句)?然后将数据源的字段绑定到 Dojo 列表文本框(记得将其设置为多值),从而允许用户删除值,但避免必须处理多个值的验证?

它应该提供一个非常优雅的解决方案,唯一可察觉的问题是它使更改单个日期值变得更加困难。

你能把字段的值拆分成几个临时的单值字段吗?

在比应该花费的时间多得多的时间之后,我找到了一个非常可行的解决方案。我有一个日期选择器边界到 requestScope.addDate,然后是一个添加按钮,它将所选值存储在 viewScope.vsDates 中作为日期数组。此外,添加按钮将后端数据设置为 viewScope.vsDates。然后添加一个由 viewScope.vsDates 填充的重复控件,重复控件在 viewScope 中显示一个按钮和每个实例的日期值。重复按钮仅在文档可编辑时显示,该按钮知道要删除的项目的位置,因此它将其从 viewScope 中删除并重置后端字段。请参见下图。