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 № 1Questo 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.