2013-04-29 6 views
7

Sto usando durandal/breeze con Knockout.validationOptions non funziona con bindingHandlers personalizzato

Sto lavorando alla convalida sui miei ingressi con ko.validation.

Ecco un classico:

<input type="text" data-bind="value: myDate, validationOptions: { errorElementClass: 'input-validation-error'}" /> 

.input-validation-error { 
    background-color: #c75b55 !important; 
} 

Questo funziona piuttosto bene: quando la convalida non è riuscita, la casella di testo in ingresso è segnato in rosso.

Ora vorrei usare un bindingHandlers al posto di un 'semplice' value vincolante:

<input type="text" data-bind="dateRW: myDate, validationOptions: { errorElementClass: 'input-validation-error'}" /> 

ko.bindingHandlers.dateRW = { 
    //dateRW --> the 'read-write' version used both for displaying & updating dates 
    init: function (element, valueAccessor, allBindingsAccessor) { 
     var observable = valueAccessor();    
     //handle the field changing 
     ko.utils.registerEventHandler(element, "change", function() { 
      var value = $(element).val(); 
      var dateFormatted = moment.utc(value, "DD/MM/YYYY"); 
      //if (dateFormatted.isValid()) 
      if (dateFormatted) 
       observable(dateFormatted.toDate()) 
      else 
       observable(null); 
     }); 
    }, 
    update: function (element, valueAccessor, allBindingsAccessor) { 
     var value = ko.utils.unwrapObservable(valueAccessor()); 
     var date = (typeof value !== 'undefined') ? moment.utc(value) : null; 
     var dateFormatted = (date != null) ? date.format('DD/MM/YYYY') : ''; 
     $(element).val(dateFormatted);    
    } 
}; 

Con questa implementazione, validazione funziona, voglio dire ko.validation.group sta lavorando bene

var validationErrorsCount = ko.computed(function() { 
    if (typeof itinerary() == 'undefined') return; 
    var validationErrors = ko.validation.group(itinerary()); 
    return validationErrors().length; 
}); 

Ma la casella di testo di input non è più contrassegnata in rosso. Sembra che "validationOptions" funzioni solo con il valore binding.

Un modo per far funzionare la mia convalida?

Grazie.

risposta

13

Il quadro di convalida hanno ganci per legare il valore, è necessario chiamare

ko.validation.makeBindingHandlerValidatable("dateRW"); 

edit: la sua non è undefined https://jsfiddle.net/it3xl/n7aqjor9/

+0

Sei sicuro di non aver sbagliato l'ortografia? Ho ricevuto l'errore 'L'oggetto # non ha alcun metodo 'makeBindingHandlerValidatable''. Grazie comunque. – Bronzato

+0

È una funzione api piuttosto nuova, stai utilizzando l'ultima versione da https://github.com/Knockout-Contrib/Knockout-Validation – Anders

+0

vedi modifica per favore – Anders

2

Guardando la fonte knockout-validation.js chiama:

makeBindingHandlerValidatable('value') a rendere il binding value automaticamente validabile.

Si potrebbe provare ad aggiungere una chiamata a makeBindingHandlerValidatable per registrare il gestore:

ko.bindingHandlers.dateRW = { 
    //dateRW --> the 'read-write' version used both for displaying & updating dates 
    init: function (element, valueAccessor, allBindingsAccessor) { 
     ... 
    }, 
    update: function (element, valueAccessor, allBindingsAccessor) { 
     ... 
    } 
}; 

ko.validation.makeBindingHandlerValidatable('dataRW'); 
0

validationMessage vincolante con un elemento vuoto.

Non voglio che la casella di testo sia contrassegnata in rosso.
A volte è possibile utilizzare un'ulteriore marcatura vuota (span) con l'attributo validationMessage.

<input data-bind="datepickerCustom: myDate"/> 
<span data-bind="validationMessage: myDate" class="validationMessage"></span> 
Problemi correlati