在viewmodel.js文件中,我想在文本框上绑定一个datepicker。
这是代码
define([
'jquery',
'durandal/app',
'services/logger',
'jqueryui'
],
function ($, app, logger, jqueryui) {
function activate() {
if (!Modernizr.inputtypes.date) {
$('input[type=date]').datepicker({
dateFormat: 'mm/dd/yyyy'
});
}
return true;
};
var vm = {
activate: activate
};
return vm;
});
似乎永远不会调用jquery和jqueryui。我的代码出了什么问题?我应该在activate()
部分或其他地方启动jQuery和jQuery UI方法吗?
答案 0 :(得分:3)
找到解决方案。
我应该在viewAttached
函数下放置jQuery相关语句。
function viewAttached() {
if (!Modernizr.inputtypes.date) {
$('input[type=date]').datepicker();
}
};
答案 1 :(得分:2)
虽然你的方法可行,但这不是更好的方法。
更好的方法是进行自定义绑定(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:{}" />