Asl*_*e G 5 javascript jquery datepicker knockout.js
我有这个模板化的淘汰赛循环:
<div id="accordion" data-bind="jqAccordion:{},template: {name: 'task-template',foreach: Tasks,afteradd: function(elem){$(elem).trigger('valueChanged');}}">. </div>
<script type="text/html" id="task-template">
<div data-bind="attr: {'id': 'Task' + TaskId}" class="group">
<h3><b><input name="TaskName" data-bind="value: TaskName /></b></h3>
<p>
Due Date: <input class="datepicker" data-bind="myDatepicker : {}, value: taskDueDate" />
</p>
</div>
</script>
Run Code Online (Sandbox Code Playgroud)
其中datepicker是一个jQuery Ui datepicker函数:
ko.bindinghandler.myDatepicker = $(function() {
init: function( element, valueAccessor) {
$(element).datepicker({
changeMonth: true,
changeYear: true
});
}),
etc.
}
Run Code Online (Sandbox Code Playgroud)
为什么这不起作用?
症状是:日历显示,窗口小部件响应我的交互,但没有日期返回到输入字段.有线索吗?
先感谢您!
您需要将一些 viewModel 属性绑定到 datepicker 绑定...您想太多了。
但是,当日期选择器更改元素的值时,您确实需要进行一些特殊处理,因为否则它会扰乱淘汰赛通常拦截更改的方式。
像这样设置绑定...
HTML:
<div id="accordion" data-bind="jqAccordion:{},template: {name: 'task-template',foreach: Tasks,afteradd: function(elem){$(elem).trigger('valueChanged');}}">. </div>
<script type="text/html" id="task-template">
<div data-bind="attr: {'id': 'Task' + TaskId}" class="group">
<h3><b><input name="TaskName" data-bind="value: TaskName /></b></h3>
<p>
Due Date: <input class="datepicker" data-bind="myDatepicker : taskDueDate" />
</p>
</div>
</script>
Run Code Online (Sandbox Code Playgroud)
处理程序如下:
ko.bindingHandlers.myDatepicker = {
init: function(element, valueAccessor) {
var unwrappedObs = valueAccessor();
$(element).val(ko.unwrap(unwrappedObs));
$(element).datepicker({
changeMonth: true,
changeYear: true
});
ko.utils.registerEventHandler(element, "change", function () {
var unwrappedObs = valueAccessor(),
val = $(element).datepicker("getDate");
unwrappedObs(val);
});
}
};
Run Code Online (Sandbox Code Playgroud)
这是一个小提琴: http://jsfiddle.net/brettwgreen/nmb6c6gq/