2016-08-24 59 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查看我的更新(部分)答案。 –