带动态knockout循环的jQuerybUI datepicker()

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)

为什么这不起作用?

症状是:日历显示,窗口小部件响应我的交互,但没有日期返回到输入字段.有线索吗?

先感谢您!

Bre*_*een 1

您需要将一些 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/