我的输入上的BindingHandlers没有正确解释

时间:2013-03-29 07:51:35

标签: knockout.js durandal

我在一个有durandal模板的网站上工作。

我的日期有这个bindingHandlers:

ko.bindingHandlers.date = {
    update: function (element, valueAccessor, allBindingsAccessor) {
        var value = valueAccessor();  // 'Mon Sep 10 2012 02:00:00 GMT+0200 (Paris, Madrid (heure d’été))'; 
        var date = moment(value());
        $(element).val((date.format('DD/MM/YYYY')));
    }
};

以下是我认为的电话:

<input type="text" class="datepicker" data-bind="date: demandDate" /> 

这用于以正确的格式格式化我的日期。它的工作原理我的意思是我的输入字段中的日期格式正确。

问题是,只要在输入字段中修改日期,系统就不会检测到任何更改。

如果我将'date'替换为'value',当值改变时会正确解释,但我会错过格式化:

<input type="text" class="datepicker" data-bind="value: demandDate" /> 

有什么想法吗?

1 个答案:

答案 0 :(得分:8)

update: valueHasMutated()发出knockout.js后,会触发绑定处理程序的ViewModel。如果要从自定义ViewModel正确应用对bindingHandler的更改,则需要在init:中为输入的更改事件创建事件处理程序,然后对其进行更改ViewModel

示例:

ko.bindingHandlers.date = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        ko.utils.registerEventHandler(element, 'change', function (event) {
            valueAccessor().demandDate($(element).val());
        }
    },
    update: function (element, valueAccessor, allBindingsAccessor) {
        var value = valueAccessor();  // 'Mon Sep 10 2012 02:00:00 GMT+0200 (Paris, Madrid (heure d’été))'; 
        var date = moment(value());
        $(element).val((date.format('DD/MM/YYYY')));
    }
};