6

我有一个表单的视图模型,我试图将验证添加到使用敲除验证。

fromDate: ko.observable(
            moment().subtract('days', 1).startOf('day').format(dateFormat)
          ),
toDate: ko.observable(
            moment().startOf('day').format(dateFormat)
        ),

我需要确保起始日期小于截止日期。我似乎无法获得任何形式的自定义验证器来获取对第二个 observable 的引用。我需要一些类似的东西:

toDate: ko.observable(moment().startOf('day').format(dateFormat)).extend({
          validation: {
            validator: function (val, someOtherVal) {
                return moment(val) >= moment(someOtherVal);
            },
            message: 'Must be greater or equal to From Date',
            params: viewModel.fromDate()
          }
        }),

有任何想法吗?

更新

我确定我已经尝试过了,但是将扩展方法移动到 onload 函数中是可行的。

$(function () {
    ko.validation.configure({ decorateElement: true });

    viewModel.toDate.extend({
    validation: {
            validator: function (val, someOtherVal) {
                return moment(val) >= moment(viewModel.fromDate());
            },
            message: 'To date must be greater than from date',
        }
    });

    ko.applyBindings(viewModel);
});
4

4 回答 4

6

淘汰赛验证的核心规则无法将可观察数据作为验证参数处理。但是已经有一个推送请求可以解决这个问题:https ://github.com/ericmbarnard/Knockout-Validation/pull/217

因此,您必须为此使用自定义角色。您应该将参数作为函数插入(通过省略括号)。这将使淘汰赛验证能够对参数的变化做出反应。

function ViewModel() {
    var self = this; // capture this to be able to reference properties

    self.fromDate = ko.observable(
        moment().subtract('days', 1).startOf('day').format(dateFormat)
    );
    self.toDate = ko.observable(
        moment().startOf('day').format(dateFormat)
    ).extend({
      validation: {
        validator: function (val, someOtherVal) {
            return moment(val) >= moment(someOtherVal());
        },
        message: 'Must be greater or equal to From Date',
        params: self.fromDate
      }
    }),
}
于 2013-01-30T09:06:29.027 回答
3

查看它的文档,这看起来像你可以做到的方式:

ko.validation.rules['greaterThan'] = {
    validator: function (val, otherVal) {
        return val > otherVal;
    },
    message: 'The field must be greater than {0}'
};

ko.validation.registerExtenders();

fromDate: ko.observable(
            moment().subtract('days', 1).startOf('day').format(dateFormat)
          ),
toDate: ko.observable(
            moment().startOf('day').format(dateFormat)
        ).extend({ greaterThan: fromDate() });

它未经测试,我不知道您是要传入 fromDate() 还是 fromDate,然后在验证器中使用 otherVal()。

于 2013-01-29T12:40:05.507 回答
0

这对聚会来说有点晚了,但是当我在谷歌上搜索“knockoutjs 密码字段匹配”时,这是最热门的。

我想要一个不使用验证扩展的匹配器,因为我不需要该包的所有产品。

我发现了一个整洁的 knockoutjs 技巧,用于使用扩展器检查两个或多个字段。也就是说,将原始字段订阅到扩展程序中的第二个字段,以便在更新原始字段时针对第二个字段触发 valueHasMutated()。

  ko.extenders.match = function(target, match_original) {
  target.match_ok = ko.observable();
  function copy(value) {
    target.match_ok(value == match_original());
  }
  function original(value) {
    target.valueHasMutated();
  }
  copy(target());
  target.subscribe(copy);
  match_original.subscribe(original);
  return target;
};

这是一个 jsfiddle 以更好地说明功能 https://jsfiddle.net/8nugva9f/13/

高温高压

于 2017-09-19T06:04:31.250 回答
-1
this.fromDate= ko.observable(null).extend({
        date: true,

    });

this.toDate = ko.observable(null).extend({
        date: true,
        min: this.fromDate,

    });

尝试这个。

于 2017-10-25T12:12:06.933 回答