0

我正在使用 Knockout,项目 Knockout-Validation 似乎是添加验证的好方法,但我无法让它工作。

有人知道上面写过什么好文章吗?

这些示例有点令人困惑,例如,包含可观察对象的主要对象是否必须是已验证的可观察对象,如果不是,您如何验证这些东西。然后在配置示例中有一行说 ko.applyBindingsWithValidation 但在其他任何地方都没有提到。

我真正想做的是有一个在可观察数组上执行 foreach 的视图。然后每个项目都有自己的保存按钮,并且需要验证。

谢谢

4

1 回答 1

1

这是实现目标的简单方法:

首先设置验证配置并使用此 tid 位启用它:

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

现在,您可以使用其他配置选项,只要您认为合适HERE即可。我只提到该grouping选项是因为如果您希望您的对象(可能是嵌套/分层的)递归遍历并识别其中的所有对象都是有效的,这一点至关重要。

然后我通常使用以下方法来验证我的模型 - 我利用这样的分组功能:

var myModel = { 
    Id: 0,
    FirstName: ko.observable('').extend({ required: true }),
    LastName: ko.observable('').extend({ required: true }),
    DateOfBirth: ko.observable('').extend({ date: true }),
    Errors: ko.validation.group(this),
    isValid: ko.computed(function() {
        return this.Errors.length == 0;
    });
};

或使用功能声明方法:

function myModel() {
    var self = this;
    self.Id = 0;
    self.FirstName = ko.observable('').extend({ required: true });
    self.LastName = ko.observable('').extend({ required: true });
    self.DateOfBirth = ko.observable('').extend({ date: true });

    self.Errors = ko.validation.group(self);

    self.isValid = ko.computed(function() {
        return this.Errors.length == 0;
    });
};

ko.validation.group(obj)是这种方法的关键。该函数将递归遍历传入的对象并识别其中的每个可验证对象。然后它将它们包装成一个validatedObservable,结果是一个observableArray,其中填充了任何验证失败的验证器生成的错误消息。

所以现在我们可以像这样编写一个保存函数,按钮接收模型,或者如果您更喜欢在对象本身中定义保存方法,这也可以:

var parentModel = {
   Save: function(model) {
      if (model.isValid())
         //perform save
      else {
         //do whatever
         //forces all error msgs associated to display in UI
         model.Errors.showAllMessages(); 
      }
   }
};

确保在调用ko.applyBindings(model)之后执行,ko.validation.init()并且您的模型已准备好验证器

希望这能给你一些帮助你开始的东西!当我第一次开始使用这个插件时,这是一个让我走上正轨的综合示例。

于 2013-04-30T07:51:57.923 回答