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