【问题标题】:Aurelia validate one datetime is greater than the otherAurelia 验证一个日期时间大于另一个
【发布时间】:2016-06-12 17:48:36
【问题描述】:

我有两个来自数据库的日期/时间,但是这些在视图上被分成四个(两个日期和两个时间),日期和时间都是自定义元素。见下文。

我的问题是我的开始日期/时间不能大于我的结束日期/时间。我知道如何在 c# 中做到这一点:

  • 检查日期字符串是否包含默认时间 00:00:00,如果是则删除。
  • 在新的日期时间中解析日期/时间字符串
  • 重复第二个日期/时间
  • 验证是否从 return from < to)

但是如果不进行 API 调用,我不知道如何在 Aurelia 中执行此操作。我已经注意到isLessThan,但是我需要先将我的字符串解析为日期时间才能做到这一点。

      bind(){
            return this.dataContext.getContent(this.id)
                .then(baseContent => {
                    this.baseContent = baseContent;
                     this.validator = this.validation.on(this)                                         
    .ensure('baseContent.ValidFromDate').isNotEmpty()
                            .ensure('baseContent.ValidFromTime').isNotEmpty()
                            .ensure('baseContent.ValidToDate').isNotEmpty()
                            .ensure('baseContent.ValidToTime').isNotEmpty()
.ensure('baseContent.ValidFromDate / baseContent.ValidFromTime').isLessThan('baseContent.ValidToDate / baseContent.ValidToTime')
;
                }); }

我知道上面的方法行不通,我是 Aurelia 的新手,但我仍然能适应它。

更新

我尝试了以下方法,但收到了一个:

未处理的承诺拒绝类型错误:path.split 不是函数

我认为问题在于它不知道将错误消息分配给什么,但我可能是错的。

.ensure(this.datetimeformat.format(baseContent.ValidFromDate, baseContent.ValidFromTime)).isLessThan(this.datetimeformat.format(baseContent.ValidToDate, baseContent.ValidFromTime));

import moment from 'moment';

export class DateTimeFormat {
    format(date, time) {

        if (date.indexOf("T") > -1) {
            date = date.split('T')[0];
        }

        return moment(date + 'T' + time, 'DD/MM/YYYY HH:mm:ss');
    }
}

我注意到其中一个答案使用了 computedFrom,但是因为我需要先将它们更改为 DateTime,然后解析回来我不知道我应该在哪里提供。

更新

.ensure('baseContent.ValidFromDate', (config) => { config.computedFrom(['baseContent.ValidFromDate', 'baseContent.ValidFromTime', 'baseContent.ValidToDate', 'baseContent.ValidToTime']) }).isNotEmpty().passes(() => {
                        return this.datetimeformat.format(this.baseContent.ValidFromDate, this.baseContent.ValidFromTime) < this.datetimeformat.format(this.baseContent.ValidToDate, this.baseContent.ValidToTime);
                    })

我想我越来越近了,但还是不行:-(

我也试过了

.ensure('baseContent.ValidFromDate', (config) => { config.computedFrom(['baseContent.ValidFromDate', 'baseContent.ValidFromTime', 'baseContent.ValidToDate', 'baseContent.ValidToTime']) }).if(() => {
                        return this.baseContent.ValidFromDate !== null && this.baseContent.ValidFromTime !== null && this.baseContent.ValidToDate !== null && this.baseContent.ValidToTime !== null})
                        .passes( () => {return this.datetimeformat.format(this.baseContent.ValidFromDate, this.baseContent.ValidFromTime) < this.datetimeformat.format(this.baseContent.ValidToDate, this.baseContent.ValidToTime)})
                    .endIf().isNotEmpty()

开发者工具没有错误。

function validateFromDateTimeIsBeforeToDateTime(dateFrom, timeFrom, dateTo, timeTo) {
        debugger;
        if (dateFrom !== null && dateFrom !== undefined &&
        timeFrom !== null && timeFrom !== undefined &&
        dateTo !== null && dateTo !== undefined &&
        timeTo !== null && timeTo !== undefined) {

            return this.datetimeformat.format(dateFrom, timeFrom) < this.datetimeformat.format(dateTo, timeTo);
    } 
    else {
        return true;
    }
}

                    .ensure('baseContent.ValidFromDate').isNotEmpty().passes(validateFromDateTimeIsBeforeToDateTime(this.baseContent.ValidFromDate, this.baseContent.ValidFromTime, this.baseContent.ValidFromDate, this.baseContent.ValidFromTime))
                    .ensure('baseContent.ValidFromTime').isNotEmpty()
                    .ensure('baseContent.ValidToDate').isNotEmpty().passes(validateFromDateTimeIsBeforeToDateTime(this.baseContent.ValidFromDate, this.baseContent.ValidFromTime, this.baseContent.ValidFromDate, this.baseContent.ValidFromTime))
                    .ensure('baseContent.ValidToTime').isNotEmpty()

然而,这会引发“未处理的承诺拒绝类型错误:无法获取未定义或空引用的属性 'datetimeformat'”

【问题讨论】:

    标签: validation datetime aurelia custom-element


    【解决方案1】:

    在这种情况下,我建议使用无处不在的 moment.js 库:

    jspm install moment

    然后像这样使用它,例如:

    import moment from 'moment';
    
    export class MyViewModel {
      date1 = "2016-02-29";
      time1 = "09:00:00";
      date2 = "2016-03-01";
      time2 = "13:00:00";
    
      myMethod() {
        let isValid = moment(`${this.date1 this.time1`).isBefore(moment(`${this.date2 this.time2`));
        alert(isValid);
      }
    }
    

    【讨论】:

    • 如果我在父级中创建它,我该如何称呼它?即 this.validator = this.validation.on(this).ensure(myMethod)?抱歉,我对此很陌生,我花了一些时间来理解它。
    【解决方案2】:

    经过大量调查,到处修复错误,我注意到突出的问题来自我的格式化类,它没有正确创建日期/时间(使用 moment.js)(在用户从日历),这意味着它返回了您无法比较的“无效日期”:-|

    这将起作用:

    this.validator = this.validation.on(this)
                        .ensure('baseContent.ValidFromDate', (config) => { config.computedFrom(['baseContent.ValidFromDate', 'baseContent.ValidFromTime', 'baseContent.ValidToDate', 'baseContent.ValidToTime']) })
                            .if(() => {
                                return this.baseContent.ValidFromDate !== null && this.baseContent.ValidFromTime !== null && this.baseContent.ValidToDate !== null && this.baseContent.ValidToTime !== null })
                                .passes( () => { return this.datetimeformat.format(this.baseContent.ValidFromDate, this.baseContent.ValidFromTime) < this.datetimeformat.format(this.baseContent.ValidToDate, this.baseContent.ValidToTime) })
                                .withMessage('< Valid To')
                            .endIf()
    

    【讨论】:

      【解决方案3】:
      .ensure('toDate', (config) => {config.computedFrom(['fromDate'])})
         .isGreaterThan( () => {return this.fromDate}, 'the entered Date');
      

      【讨论】:

      • 如何连接日期和时间?
      猜你喜欢
      • 2012-05-26
      • 2015-11-17
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-07
      • 1970-01-01
      相关资源
      最近更新 更多