敲除验证 - 日期大于另一个日期

Knockout-Validation - Date greater than another date

我一直在研究使用敲除验证来比较日期的不同方法。我无法让它在 validatedObservable 对象中与我的 obervables 一起工作。

我需要 validatedObservable 来检查按钮单击时验证是否通过/失败 - 这是我的控件分组。

这是我的演示:

<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/knockout-2.3.0.js"></script>
<script src="~/Scripts/knockout.validation.min.js"></script>
<script src="~/Scripts/moment.min.js"></script>
<form>
    <table>
        <tr>
            <td>Name:</td>
            <td><input type="text" data-bind="value:contactForm().name" value="" /></td>
        </tr>
        <tr>
            <td>From:</td>
            <td><input type="text" data-bind="value:contactForm().fromDate" value="" /></td>
        </tr>
        <tr>
            <td>To:</td>
            <td><input type="text" data-bind="value:contactForm().toDate" /></td>
        </tr>
    </table>
    <button type="button" data-bind='click: submit'>Submit</button>
</form>
<script>

    ko.validation.init({
        messagesOnModified: false,
        parseInputAttributes: true,
        grouping: {
            deep: true
        }
    });

    var myViewModel = function () {
        var self = this;
        self.contactForm = ko.validatedObservable({
                name :ko.observable().extend({ required: true }),
                fromDate :ko.observable('2014-11-10').extend({ date: true }),
                toDate: ko.observable('2014-11-10').extend({date: true, min: this.fromDate })
            });
            submit = function () {
                console.log(this.contactForm.isValid())
            };
        };

        ko.applyBindings(new myViewModel());

</script>

我基本上无法让这条线工作:

toDate: ko.observable('2014-11-10').extend({date: true, min: this.fromDate })

有人有什么想法吗?

那是因为您在对象文字创建中使用了 this(当您在 toDate 声明中引用 fromDate 时),并且在构造该对象时,this 仍然指的是封装函数上下文(在这种情况下为 myViewModel)。

试试这个(基于 this answer):

self.contactForm = ko.validatedObservable({
            name: ko.observable().extend({ required: true }),
            fromDate: ko.observable('2014-11-10').extend({ date: true }),
            toDate: ko.observable('2014-11-10'),
            init: function() {
                this.toDate = this.toDate.extend({date: true, min: this.fromDate});
                return this;
            }
        }.init());