2016-08-24 56 views
1

我有一个模型,其中包含一个多选和一个文本框。依赖验证在淘汰赛不起作用

我想验证显示,如果他们没有填充,但没有验证错误,如果至少其中一个填充。 (选中的一个项目点击或某些文本)。

我有一个工作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; 
     }); 
} 

我想自定义验证,并在阳光下每一个组合。

任何想法接下来要尝试什么?

我使用淘汰赛V3.2.0-β

+0

{onlyIf:function(){return self.SubscribersOrEmails === 0; } 你必须调用带括号的observable self.SubscribersOrEmails() –

+0

我很确定这是不正确的计算函数。我在网上找到的例子不需要括号。如果我添加括号,你会得到:self.SubscribersOrEmails不是函数 – Nick

+0

ko.pureComputed不是函数 我认为这是一个不同的淘汰赛版本。但我尝试了一种不起作用的类似方法 – Nick

回答

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); 
}); 

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

+0

检查我的plunkr。您将看到“调试信息”是有效且正确的,但验证规则被忽略 – Nick

+0

@Nick查看我的更新(部分)答案。 –