/ / knockout js bind z datetimepicker daje wyjątek - javascript, jquery-ui, knockout.js, knockout-2.0

knockout js bind z datetimepicker daje wyjątek - javascript, jquery-ui, knockout.js, knockout-2.0

Myślę, że mogę łatwo powiązać dane daty z kalendarzem jquery ui i knockout.js dzięki ta odpowiedź.

Teraz muszę powiązać datę i godzinę. Oczywiście, że mogę użyć timepicker. Ale nie jestem pewien, jak mogę powiązać jego dane z knockout.js. Spodziewałem się, że będzie podobny do datepicker, więc wykonałem następujący skrypt

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

Ale kiedy uruchomiłem skrypt, pojawia się błąd w linii //**** w javascript

TypeError: observable is not a function

Ale nie mogę tutaj znaleźć tego, co zrobiłem źle.

Odpowiedzi:

2 dla odpowiedzi № 1

Ten szczególny błąd wynika z możliwego do zaobserwowania =linia valueAccessor (). Przypisujesz do obserwowalnej wartości valueAccessor, dodając () na końcu. Aby przekazać wartość obserwowalnym w ten sposób, należy zamiast tego napisać:

var observable = valueAccessor;

W przeciwnym razie obserwowalne nie jest „funkcją obserwowalną”.


1 dla odpowiedzi nr 2

Właśnie znalazłem następujący kod działa. Ponieważ niewiele robi kodu open source, ten dodatek nie jest zbyt stabilny i wywoła zdarzenie zmiany z czasami obserwowalnym zeriem. Dlatego stworzyłem kod, aby złapać wyjątek i przejść dalej.

    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 dla odpowiedzi nr 3

Zastąp tę linię

var observable = valueAccessor();

Z

var xxxx= valueAccessor();

Ponieważ nie można użyć obserwowalnego, ponieważ jest to słowo kluczowe zastrzeżone w nokaut.

Ponadto, gdzieś w przyszłości może pojawić się błąd, jeśli użyjesz obserwowalnej jako nazwy zmiennej.