【问题标题】:KnockOut validation between two dates?两个日期之间的淘汰赛验证?
【发布时间】:2014-08-12 12:31:32
【问题描述】:

我有两个文本框,它们与 Datepicker 绑定处理程序绑定,以便在单击文本框 (DD/MM/YYYY) 时显示一个日期选择器。

我的两个文本框是 FromTo 文本框。顾名思义,我希望验证能够像 To 那样工作,日期总是大于 From

我尝试使用谷歌搜索,但遗憾的是我的努力不足以获取正确的信息。

坦率地说,我已经使用带有拆分的 jquery 完成了此验证,比较有点循环和复杂,最重要的是它不是淘汰方式。

我正在尝试以 KnockOut 方式做事,欢迎提出任何建议。

更新:我正在尝试这样的事情

self.Validation = ko.validatedObservable([

            self.ToDate.extend({ 
                validation: {
                    validator: function (val, someOtherVal) {
                         Date.parse(val) > Date.parse(someOtherVal()); 
       var date1 = val.split('/'); var date2 = someOtherVal().split('/');
      var TDate = new Date(date1[2], date1[1], date1[0]); var FDate = new Date(date1[2],             date1[1], date1[0]);
                         if (Date.parse(Tdate) > Date.parse(FDate))
                         { return true; } else { return false; }
                    },
                    message: 'Must be greater than FromDate',
                    params: self.FromDate
                } 
            })
        ]);

好吧,代码看起来很乱。如果我有空的val,即ToDate,则我在OnLoad 时遇到上述代码的一个问题。我在split 收到错误,这是正确的。有什么办法可以限制这个错误。

【问题讨论】:

    标签: jquery validation knockout.js


    【解决方案1】:

    让你的 to/from 值都绑定到计算的读/写 observable,这些 observable 正在写入视图模型中的私有 observable。

    self._StartTime = ko.observable();
    self.StartTime = ko.computed({
        read: function () { return self._StartTime(); },
        write: function (newStartTime) {
            if (!newStartTime) {
                self._StartTime(null);
                self._EndTime(null);
                return;
            }
            // other code here
        }
    });
    

    对结束时间执行相同操作,当从任一输入字段完成读/写时,您可以访问计算区域中的两个参数...

    【讨论】:

    • 我可以完全访问日期,但我正在寻找一些简短而可爱的东西,因为淘汰赛总是比较日期,而不是像我上面所做的那样艰难地进行。我完成了使用正常的 appprocah (value:ToDate) 而不是使用 computed 并调用 (value:computeddate) 。无论哪种方式,我都可以访问日期,但comapring一直存在问题。我的格式(DD/MM/YYYY)
    • 好吧,如果你想比较它们,你将不得不编写一些代码来做到这一点......至少有一些验证逻辑......有一个计算设置来管理这个是如何利用“可爱”
    【解决方案2】:

    使用瞬间你可以很容易地做到这一点

    ko.validation.rules['dateGreaterThen'] = {
        validator: function (val, otherVal) {
            var d1 = moment(val, 'yy/mm/dd');
            var d2 = moment(otherVal(), 'yy/mm/dd');
            return d1 >= d2
        },
        message: function (val) {
            var date = moment(val()).format('yy/mm/dd')
            return 'The date must be greater then or equal to ' + date
        }
    };
    
    ko.validation.registerExtenders();
    

    【讨论】:

    • 啊是的,它可以这样做。我正在考虑使用不需要正确提及的时刻在 cshtml 中绑定。好奇的怀疑如果valundefined 会发生什么我会在moment(val, 'yy/mm/dd') 得到任何错误
    • 如果 val 未定义,则使用条件显示其他消息。如果您添加所需的验证,这将很容易解决。
    猜你喜欢
    • 2015-11-17
    • 1970-01-01
    • 2012-02-18
    • 2011-08-09
    • 1970-01-01
    • 2013-01-12
    • 2023-03-08
    • 1970-01-01
    • 2012-11-04
    相关资源
    最近更新 更多