我有一个包含多选和文本框的模型。
如果没有填充验证,我希望验证显示,但如果至少填充其中一个验证错误,则不会显示验证错误。 (单击选择中的一个项目,或某些文本)。
我在这里有一个工作的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
答案 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);
});
错误消息永远不会被清除,因为您没有代码可以清除它们。