あなたのアプローチは機能しますが、それはより良い方法ではありません。
より良い方法は、カスタム バインディングを作成することです ( http://knockoutjs.com/documentation/custom-bindings.html )。手動でバインディングを行いたくない場合は、jqueryui のバインディングを含むライブラリ (私は使用しないので、うまく機能するかどうかはわかりません) があります: http://gvas.github.com /knockout-jqueryui/index.html
とにかく、例のバインディングは次のようになります。
ko.bindingHandlers.datepicker = {
init: function (element, valueAccessor, allBindingsAccessor) {
//initialize datepicker with some optional options
var options = allBindingsAccessor().datepickerOptions || {},
$element = $(element),
$btn = $("<button class='btn' type='button'><i class='icon-calendar'></i></button>");
$element.datepicker(options);
$element.prop("readonly", true);
$element.wrap("<div class='input-append' />");
$element.after($btn);
$btn.click(function () {
$element.datepicker("show");
});
//handle the field changing
ko.utils.registerEventHandler(element, "change", function () {
var observable = valueAccessor(),
current = $(element).datepicker("getDate");
observable(current);
});
//handle disposal (if KO removes by the template binding)
ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
$(element).datepicker("destroy");
});
},
update: function (element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor()),
current = $(element).datepicker("getDate");
if (value - current !== 0) {
$(element).datepicker("setDate", value);
}
}
};
そしてビューで:
<input type="text" id="yourid" data-bind="datepicker: yourobservable, datepickerOptions:{}" />