2014-02-16 123 views
2

我正在嘗試使用Knockout創建複選框列表,並要求至少使用Knockout驗證檢查一個複選框。敲除驗證複選框列表必需驗證消息

我遇到的問題是所需的驗證消息出現多次,每個選項一次,如果沒有選中複選框。我該如何解決這個問題?

工作示例:http://jsfiddle.net/aaronhoffman/BtK3t/

的HTML

<script id="koValidationCustomMessageTemplate" type="text/html"> 
    <em class="text-danger" data-bind="validationMessage: field"></em> 
</script> 

<div class="col-sm-5" data-bind="foreach: TheCheckboxListOptions"> 
    <div class="checkbox"> 
     <label> 
      <input type="checkbox" data-bind="value: $data, checked: $root.TheCheckboxListSelectedValues" /><span data-bind="text: $data"></span> 
     </label> 
    </div> 
</div> 

和JavaScript

ko.validation.configure({ 
    registerExtenders: true, 
    messagesOnModified: true, 
    insertMessages: true, 
    parseInputAttributes: true, 
    messageTemplate: "koValidationCustomMessageTemplate" 
}); 

var TheViewModel = { 

    TheCheckboxListOptions: [ 
     "Option 1", 
     "Option 2", 
     "Option 3", 
     "Option 4" 
    ], 

    TheCheckboxListSelectedValues: ko.observableArray().extend({ 
     required: { message: "At least one option is required." } 
    }), 

}; 


ko.applyBindings(TheViewModel); 
+0

能更改視圖模式,包括返回的選定個數的真大於1並寫入針對該而不是整個陣列的驗證所計算的布爾屬性? – arb

+0

謝謝,我今天正在使用類似的解決方案,我只是在尋找更好的解決方案。 –

回答

0

對於這種類型的東西,我通常使用jQuery驗證提交之前,驗證的形式(回傳或通過AJAX)。我寫了一個自定義的jQuery驗證規則。這裏有一個例子:

$.validator.addMethod('required_checkbox', function(value, element) { 
    var $module = $('#myCheckboxList'); 
    var checked = $module.find('input[type="checkbox"]:checked'); 
    if (checked.length === 0) { 
     return false; 
    } else { 
     return true; 
    } 
}); 

$.validator.addClassRules('required-checkbox', { 'required_checkbox': true }); 

而且標記的樣子:

<ul id="myCheckboxList"> 
    <li><input type="checkbox" name="MyCheckboxes" class="required-checkbox" value="@myList.Id"></li> 
    .... 
</ul> 

您可以驗證整個表單或提交之前,從你的淘汰賽視圖模型中做這樣的事情是它的一部分:

$('form').validate(); 
1

基因敲除驗證產生的錯誤集合只有一個錯誤消息。但是,由於observable綁定到一組控件,因此每個控件都顯示一次。您可以將驗證消息模板自定義爲星號或每個控件爲空,然後在控件數組上方顯示驗證摘要。看到我的修改小提琴。

http://jsfiddle.net/BtK3t/2/

<script id="koValidationCustomMessageTemplate" type="text/html"> 
    <span style="color: Red" data-bind="if: field.isModified() && !field.isValid()">*</span> 
</script> 

<ul data-bind="foreach: errors, visible: showValidationSummary" 
    style="display: none; margin-left: 5px; text-align: left;"> 
    <li style="color: Red"><span data-bind="text: $data"></span></li> 
</ul>