2011-12-28 4 views
6

Sto utilizzando la libreria Knockout JS per collegare i controlli di input HTML5 nella mia applicazione Web che è destinata all'esecuzione su iPad (iOS5, Safari 5.1). L'associazione funziona bene per i tipi di input come testo e seleziona ma non per data. Dopo aver selezionato un valore di data attraverso il datepicker, il valore non viene associato alla proprietà viewModel (in effetti non viene salvato).Knockout JS: modifica dell'evento non attivato per data HTML5 su iPad

Ecco come appare il mio codice HTML.

<input id="dob" name="dob" type="date" data-bind="value: dob" /> 

Ho provato a risolvere il problema con un binding personalizzato in cui ho inizializzato un gestore di eventi di modifica.

ko.bindingHandlers.datePicker = { 
    init: function (element, valueAccessor) { 
     ko.utils.registerEventHandler(element, "change", function() { 
      var observable = valueAccessor(); 
      observable($(element).val()); 
     }); 
    }, 
    update: function (element, valueAccessor) { 
     var value = ko.utils.unwrapObservable(valueAccessor()); 
     $(element).val(value); 
    } 
}; 

Modifica del codice HTML per -

<input id="dob" name="dob" type="date" data-bind="datePicker: dob" /> 

Stranamente, anche questo evento non è sparare. Si noti che in entrambi gli scenari l'associazione avviene perfettamente in Windows XP sui browser Opera e Safari.

In definitiva, ho ottenuto la soluzione al mio problema utilizzando l'evento 'sfocatura' invece di 'modifica' nell'associazione personalizzata. Ora viene chiamato il gestore eventi e sto impostando manualmente il valore dal controllo data.

Ora la mia domanda è, è qualcosa che non sto facendo correttamente e in caso contrario, perché l'evento di modifica del controllo data HTML5 non viene attivato, sia per impostazione predefinita che tramite associazione personalizzata? Voglio che il controllo della data funzioni come dovrebbe.

risposta

13

Non stai facendo nulla di sbagliato da una prospettiva di Knockout. Questi eventi in realtà non vengono licenziati (senza Knockout nemmeno nella foto) da quello che posso dire testando e ricercando un po '.

si può evitare una consuetudine vincolante facendo:

<input type="date" data-bind="value: myDate, valueUpdate: 'blur'" />

+0

Grazie a @RP! Questo ha funzionato come un fascino. Credo che quello che stavo facendo attraverso l'associazione del cliente dell'evento di sfocatura, è fatto da valueUpdate. Buon apprendimento –

+0

Anche questo ha funzionato perfettamente con il Blackberry. Grazie. – johnwards

4

ho avuto problema simile, ma nel mio caso, anche l'evento blur è in realtà non licenziato. Quindi ho usato l'evento di input con la proprietà valueUpdate e ho risolto il problema.