Knockout 中的依赖验证不起作用

dependant validation in Knockout not working

我有一个包含多个 select 和一个文本框的模型。

如果其中 none 个已填充,我希望显示验证,但如果至少其中一个已填充,则不会出现验证错误。 (单击 select 中的一项或某些文本)。

我这里有一个工作的plunkr: plnkr.co/edit/pwKohFTmLPW1BKNwHxWR?p=preview

我尝试了数千次都没有成功。 其核心问题是 self.isValid() 不会触发验证功能 SubscribersOrEmails

目前我有这个:

var ReportSchedule = function () {

   self.Subscribers = ko.observableArray().extend({ required: { onlyIf: function () { return self.SubscribersOrEmails === 0; } } });
   self.Emails = ko.observableArray().extend({ required: { onlyIf: function () { return self.SubscribersOrEmails === 0; } } });
   self.EmailText = ko.observable();

   self.SubscribersOrEmails = ko.computed(function () {
            var counter = 0;
            if (self.Emails != null && self.Subscribers != null) {
                counter = self.Emails().length + self.Subscribers().length;
            }
            console.log("counter: " + counter);
            return counter;
        });
}

我尝试了自定义验证器和阳光下的每一种组合。

知道接下来要尝试什么吗?

我正在使用 knockout v3.2.0-beta

这应该可以解决。您的 computed 期望变量存在,并且您的验证例程期望 computed 存在,因此您需要将变量与其扩展分开。

您正在检查计算变量是否存在,但这阻止了 Knockout 找出依赖关系。

所需的参数可以是self.subscribersOrEmails,不需要将其包装在函数中。

self.Subscribers = ko.observableArray();
self.Emails = ko.observableArray();
self.EmailText = ko.observable();
self.Name = ko.observable();

self.SubscribersOrEmails = ko.computed(function() {
  console.log("validation ");
  var counter = 0;

  console.log(self.Emails);
  console.log(self.Subscribers);
  counter = self.Emails().length + self.Subscribers().length;
  console.log("counter: " + counter);
  return counter == 0;
});

self.Subscribers.extend({
  required: {
    onlyIf: self.SubscribersOrEmails,
    params: 'Subscribers'
  }
});
self.Emails.extend({
  required: {
    onlyIf: self.SubscribersOrEmails,
    params: 'Emails'
  }
});

此外:您正在覆盖 Emails 而不是在此处设置其内容:

self.populateEmails = function() {
  self.Emails(self.getEmailsFromText(self.EmailText()));
}

还有这里:

$.each(self.schedulesViewModel.Schedules, function(index, schedule) {
  var emailsArray = schedule.getEmailsFromText(schedule.EmailText());
  schedule.Emails(emailsArray);
});

错误消息永远不会被清除,因为您没有清除它们的代码。