2013-08-23 108 views
29

使用Twitter Bootstrap驗證類,例如需要將has-errorhas-warning放在包裝form-group元素上,以便對輸入元素和它的標籤進行樣式設置。但是Knockout-Validation會將該類添加到輸入元素中。Bootstrap twitter 3.0和knockoutjs驗證

<div class="form-group has-error"> 
    <label class="control-label">Input with error</label> 
    <input type="text" class="form-control"> 
</div> 

是否有可能配置淘汰賽驗證的,因爲它增加了類的div,而不是input的方法嗎?

+2

你能澄清你的英語嗎?特別是,這句話沒有意義:「Bootstrap想要改變div而不是輸入元素。」想改變分區?什麼div?以什麼方式?這與輸入元素有什麼關係? –

回答

56

bringking的答案並沒有讓你一路走到那裏。您還需要指定errorMessageClassdecorateInputElement選項。

ko.validation.init({ 
 
    errorElementClass: 'has-error', 
 
    errorMessageClass: 'help-block', 
 
    decorateInputElement: true 
 
}); 
 

 
var viewModel = ko.validatedObservable({ 
 
    name: ko.observable().extend({ 
 
    required: true 
 
    }), 
 
    email: ko.observable().extend({ 
 
    required: true, 
 
    email: true 
 
    }), 
 
    submit: function() { 
 

 
    if (!this.isValid()) { 
 
     this.errors.showAllMessages(); 
 
    } else { 
 
     alert('good job'); 
 
    } 
 
    } 
 
}); 
 

 
ko.applyBindings(viewModel);
<link href="http://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.0.2/css/bootstrap.min.css" rel="stylesheet" /> 
 

 

 
<div class="container"> 
 
    <form class="form-horizontal"> 
 
    <div class="form-group" data-bind="validationElement: name"> 
 
     <label class="control-label col-xs-2" for="name">Name</label> 
 
     <div class="col-xs-10"> 
 
     <input id="name" class="form-control" type="text" data-bind="textInput: name" /> 
 
     </div> 
 
    </div> 
 
    <div class="form-group" data-bind="validationElement: email"> 
 
     <label class="control-label col-xs-2" for="email">Email</label> 
 
     <div class="col-xs-10"> 
 
     <input id="email" class="form-control" type="text" data-bind="textInput: email" /> 
 
     </div> 
 
    </div> 
 
    <div class="form-group"> 
 
     <div class="col-xs-offset-2 col-xs-10"> 
 
     <button type="submit" class="btn btn-primary" data-bind="click: submit">Submit</button> 
 
     </div> 
 
    </div> 
 
    </form> 
 
</div> 
 

 

 
<script src="http://cdnjs.cloudflare.com/ajax/libs/knockout/3.3.0/knockout-min.js"></script> 
 
<script src="http://cdnjs.cloudflare.com/ajax/libs/knockout-validation/2.0.3/knockout.validation.min.js"></script>

+4

該選項現在稱爲decorateInputElement。見https://github.com/Knockout-Contrib/Knockout-Validation/wiki/Configuration –

+0

@RichardCollette更新 –

+0

謝謝!對於任何嘗試類似的人來說,初始化函數需要在開始綁定之前在視圖模型之外運行 –

2

你會使用「validationElement」裝訂處理器引導形式div-

<div class="form-group" data-bind="validationElement: someObservable"> 
    <label class="control-label" for="inputSuccess">Input with success</label> 
    <input type="text" class="form-control" id="inputSuccess"> 
</div> 

然後您將設置configuration淘汰賽驗證插件使用引導錯誤類「有錯誤」的。

ko.validation.init({errorElementClass:'has-error'}) 

這是我在我們的工具中執行此操作的方式。

5

你可以擴展驗證淘汰賽核心是這樣的:

var init = ko.bindingHandlers['validationCore'].init; 
ko.bindingHandlers['validationCore'].init = function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
    init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext); 
    var config = ko.validation.utils.getConfigOptions(element); 
    // if requested, add binding to decorate element 
    if (config.decorateInputElement && ko.validation.utils.isValidatable(valueAccessor())) { 
     var parent = $(element).parents(".form-group"); 
     if (parent.length) { 
      ko.applyBindingsToNode(parent[0], { validationElement: valueAccessor() }); 
     } 
    } 
}; 

該代碼使得父窗體組具有相同類作爲輸入來裝飾。

+0

謝謝,只需將'config.decorateElement'更改爲'config.decorateInputElement'以匹配當前版本。 –

+0

@MikaTähtinen已更新 –

+0

這是一個非常整潔的解決方案,也導致我遇到了一個問題的根源,其他人可能也會遇到 - 我使用一個自定義綁定來添加包裝器元素(對於Material Design Lite)和也有一個值/ textInput綁定。現在看起來很明顯,順序非常重要,因爲您需要在驗證初始化觸發之前添加包裝器元素 - 所以請確保您的值/ textInput綁定在任何自定義綁定之後添加包裝器元素。 – fubaar