/ / knockout js bind with datetimepicker dà un'eccezione: javascript, jquery-ui, knockout.js, knockout-2.0

knockout js bind con datetimepicker fornisce un'eccezione - javascript, jquery-ui, knockout.js, knockout-2.0

Penso di poter facilmente associare i dati di una data con jquery ui calendar e knockout.js grazie a questa risposta

Ora ho bisogno di associare i dati di una data e l'ora. Certo che posso usare TimePicker. Ma non sono sicuro di come posso associare i suoi dati con knockout.js. Mi aspettavo che fosse simile a Datepicker, quindi ho realizzato il seguente script

    ko.bindingHandlers.datetimepicker = {
init: function (element, valueAccessor, allBindingsAccessor) {
//initialize datepicker with some optional options
var options = allBindingsAccessor().datetimepickerOptions || {};
$(element).datetimepicker(options);

//handle the field changing
ko.utils.registerEventHandler(element, "change", function () {
var observable = valueAccessor();
observable($(element).datetimepicker("getDate"));//****
});

//handle disposal (if KO removes by the template binding)
ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
$(element).datetimepicker("destroy");
});

},
update: function (element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor()),
current = $(element).datetimepicker("getDate");

if (value - current !== 0) {
$(element).datetimepicker("setDate", value);
}
}
};

Ma quando ho eseguito lo script, ricevo un errore in linea di //**** in javascript

TypeError: observable is not a function

Ma non riesco a trovare quello che ho fatto di sbagliato qui.

risposte:

2 per risposta № 1

Questo particolare errore è dovuto all'osservabile =linea valueAccessor (). Stai assegnando a osservabile il valore di valueAccessor aggiungendo () alla fine. Per passare un valore osservabile in questo modo, dovresti invece scrivere:

var observable = valueAccessor;

Altrimenti, osservabile non è una "funzione osservabile".


1 per risposta № 2

Ho appena scoperto che il seguente codice funziona. Come pochi codice open source fanno, questo componente aggiuntivo non è molto stabile e a volte chiamerà l'evento change con null osservabile. Quindi ho creato il codice per catturare l'eccezione e andare avanti.

    ko.bindingHandlers.datetimepicker = {
init: function (element, valueAccessor, allBindingsAccessor) {
//initialize datepicker with some optional options
var options = allBindingsAccessor().datetimepickerOptions || {};
$(element).datetimepicker(options);

//handle the field changing
ko.utils.registerEventHandler(element, "change", function () {
var observable = valueAccessor();
try {
observable($(element).datetimepicker("getDate"));//****
}
catch(ex) {}
});

//handle disposal (if KO removes by the template binding)
ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
$(element).datetimepicker("destroy");
});

},
update: function (element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor()),
current = $(element).datetimepicker("getDate");

if (value - current !== 0) {
$(element).datetimepicker("setDate", value);
}
}
};

-1 per risposta № 3

Sostituisci questa linea

var observable = valueAccessor();

Con

var xxxx= valueAccessor();

Perché non è possibile utilizzare l'osservabile, perché è una parola chiave riservata in knockout.

Inoltre, potresti ricevere errori da qualche parte in futuro se usi osservabile come nome variabile.