Knockout中的依赖验证不起作用

时间:2016-08-24 14:22:56

标签: knockout.js knockout-validation

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

如果没有填充验证,我希望验证显示,但如果至少填充其中一个验证错误,则不会显示验证错误。 (单击选择中的一个项目,或某些文本)。

我在这里有一个工作的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

1 个答案:

答案 0 :(得分:0)

这应该解决它。您的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);
});

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