2013-08-23 16 views
29

Con Twitter Bootstrap le classi di convalida, ad es. has-error o has-warning devono essere inseriti nell'elemento di fasciatura form-group per modellare l'elemento di input e la sua etichetta. Ma Knockout-Validation aggiunge la classe all'elemento input.Bootstrap twitter 3.0 e convalida knockoutjs

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

E 'possibile configurare Knockout-convalida in un modo che aggiunge le classi al div e non il input?

+2

Puoi chiarire il tuo inglese? In particolare, questa frase non ha senso: "Bootstrap vuole cambiare il div al posto dell'elemento di input." Vuole cambiare il div? Che div? E in che modo? Che cosa ha a che fare con gli elementi di input? –

risposta

56

La risposta da parte del fringking non ti porta fino in fondo. Dovrai inoltre specificare le opzioni errorMessageClass e decorateInputElement.

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

L'opzione è ora denominata decorInputElement. Vedi https://github.com/Knockout-Contrib/Knockout-Validation/wiki/Configuration –

+0

@RichardCollette aggiornato –

+0

Grazie! Per chiunque provi simili, la funzione init deve essere eseguita al di fuori di un viewmodel/prima di iniziare binds –

2

Si potrebbe utilizzare il "validationElement" gestore vincolante per il modulo di 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> 

allora si sarebbe impostare il configuration per il plugin di convalida ko di utilizzare la classe di errore bootstrap di "ha-errore".

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

Questo è il modo in cui lo faccio nel nostro strumento.

5

Si potrebbe estendere nucleo convalida eliminazione diretta come questo:

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

Questo codice rende la forma-gruppo padre essere decorato con la stessa classe come ingresso.

+0

Grazie, bastava cambiare 'config.decorateElement' in' config.decorateInputElement' per adattarsi alla versione corrente. –

+0

@ MikaTähtinen aggiornato –

+0

Questa è una soluzione davvero accurata, e mi ha anche portato alla fonte di un problema che stavo facendo incontrare anche ad altri - dove stavo usando un binding personalizzato per aggiungere gli elementi wrapper (per Material Design Lite) e aveva anche un valore/textInput binding. L'ordine, come sembra ovvio ora, è importante in quanto è necessario aggiungere l'elemento wrapper prima che venga avviato l'avvio della validazione, quindi assicurati che il tuo valore/binding textInput sia dopo l'associazione personalizzata per aggiungere l'elemento wrapper. – fubaar

Problemi correlati