2013-08-23 32 views
29

Với Twitter Bootstrap các lớp xác thực, ví dụ: has-error hoặc has-warning cần được đặt trên thành phần gói form-group để tạo kiểu cho phần tử đầu vào và nhãn của nó. Nhưng Knockout-Validation thêm lớp vào phần tử đầu vào.Bootstrap twitter 3.0 và xác nhận knockoutjs

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

Có thể cấu hình Knockout-Validation trong một cách mà nó bổ sung thêm các lớp vào div và không phải là input?

+2

Bạn có thể làm rõ tiếng Anh của mình không? Đặc biệt, câu này không có ý nghĩa: "Bootstrap muốn thay đổi div thay vì phần tử đầu vào." Muốn thay đổi div? Những gì div? Và theo cách nào? Điều này phải làm gì với các yếu tố đầu vào? –

Trả lời

56

Câu trả lời của thebringking không giúp bạn đạt được điều đó. Bạn cũng cần phải chỉ định các tùy chọn 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

Tùy chọn bây giờ được gọi là decorInputElement. Xem https://github.com/Knockout-Contrib/Knockout-Validation/wiki/Configuration –

+0

@RichardCollette cập nhật –

+0

Cảm ơn! Đối với bất kỳ ai cố gắng tương tự, hàm init cần phải được chạy bên ngoài một viewmodel/trước khi bắt đầu liên kết –

2

Bạn sẽ sử dụng "validationElement" xử lý bắt buộc đối với các hình thức bootstrap 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> 

Sau đó, bạn sẽ thiết lập các configuration cho plugin xác nhận loại trực tiếp để sử dụng lớp lỗi bootstrap của "có lỗi".

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

Đây là cách tôi làm điều đó trong công cụ của chúng tôi.

5

Bạn có thể mở rộng cốt lõi xác nhận loại trực tiếp như thế này:

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

Mã này làm cho phụ huynh hình thức nhóm được trang trí bằng những lớp giống như đầu vào.

+0

Cảm ơn, chỉ cần thay đổi 'config.decorateElement' thành' config.decorateInputElement' để khớp với phiên bản hiện tại. –

+0

@ MikaTähtinen cập nhật –

+0

Đây là một giải pháp thực sự gọn gàng, và cũng dẫn tôi đến nguồn gốc của một vấn đề mà tôi gặp phải - những người khác cũng gặp phải - nơi tôi đang sử dụng một ràng buộc tùy chỉnh để thêm các yếu tố bao bọc (cho Material Design Lite) và cũng có một ràng buộc value/textInput. Thứ tự, dường như hiển nhiên bây giờ, là quan trọng vì bạn cần phần tử wrapper được thêm vào trước khi init xác nhận kích hoạt - vì vậy hãy đảm bảo ràng buộc giá trị/textInput của bạn sau bất kỳ ràng buộc tùy chỉnh nào để thêm phần tử trình bao bọc. – fubaar

Các vấn đề liên quan