嵌套集合的敲除验证

Knockout validation on a nested collection

我正在使用 Knockoutjs.com 为 "Contacts Editor" 提供的示例。

http://jsfiddle.net/rniemeyer/gZC5k/

我在我的网站上使用完全相同的代码,现在需要验证提交时是否缺少信息。

以下是我想在表单上实施的验证规则:

  1. 如果任何字段(姓名和 Phone 必填)为空,则不允许提交表单。
  2. 如果姓名没有任何 Phone 号码(parent 没有 children),则不允许提交表格。
  3. 如果没有姓名则不允许提交表格(没有 parent 的完全空白表格)

我唯一能弄清楚如何分析的是缺少的名字:

contacts().length = 0

您可以在视图模型中引入额外的标志,例如"isValid":

self.isValid = ko.computed(function() {
    if(self.contacts().length === 0) {
    return false;
  }
  var allContactsHaveNames = self.contacts().filter(function(contact) {
    return contact.firstName() !== "" && contact.lastName() !== "";
  }).length === self.contacts().length;
  return allContactsHaveNames;
});

并在其中进行所有检查。

当然,这需要更改标记:

<button data-bind='click: save, enable: isValid'>Save to JSON</button>

和可观察的"firstName"和"lastName"字段:

self.contacts = ko.observableArray(ko.utils.arrayMap(联系人, 函数(联系人) { return { 名字:ko.observable(contact.firstName),姓氏:ko.observable(contact.lastName),电话:ko.observableArray(contact.phones) }; }));

self.addContact = function() {
    self.contacts.push({
        firstName: ko.observable(""),
        lastName: ko.observable(""),
        phones: ko.observableArray()
    });
};

任何额外的检查都可以添加到 "isValid" 计算函数中。

您可以检查更新 jsfiddle

P.S。您可以使用 Knockout 验证,正如评论中建议的@Sam.C。