0

我有以下 bindingHandlers 允许我格式化我的日期:

ko.bindingHandlers.dateRW = {
    //dateRW --> the 'read-write' version used both for displaying & updating dates
    init: function (element, valueAccessor, allBindingsAccessor) {
        //handle the field changing
        ko.utils.registerEventHandler(element, "change", function () {
            var observable = valueAccessor();
            var myDate = moment($(element).val(), "DD/MM/YYYY");
            observable(myDate.toDate());
        });
    },
    update: function (element, valueAccessor, allBindingsAccessor) {
        var value = valueAccessor();  // 'Mon Sep 10 2012 02:00:00 GMT+0200 (Paris, Madrid (heure d’été))'; 
        var date = (typeof value() !== 'undefined') ? moment(value()) : null;
        var dateFormatted = (date != null) ? date.format('DD/MM/YYYY') : '';
        $(element).val(dateFormatted);
    }
};

使用示例:

<input type="text" data-bind="dateRW: myDate" />

它可以工作,但是每当我编辑输入元素时,我都需要在元素的外部(失去焦点)单击以触发value change. 我已经尝试过valueUpdate: 'afterkeydown',但它不起作用。我知道valueHasMutated存在,但我不知道是否必须这样做。

谢谢。


更新

按照建议,我尝试使用该keyup事件。我提醒我,我唯一的目标是“模拟”在 keyup 事件中值发生了变化。

ko.utils.registerEventHandler(element, "keyup", function () {
    observable($(element).val());
});

有了这个实现,问题是updatebindingHandlers 上的每个按键都会被触发。这通常会导致日期无效。示例:用户将在输入字段中一次输入一个数字的新日期。对于每个数字,都会触发更新,并且输入的新内容会被错误地解释。

我也试试这个:

ko.utils.registerEventHandler(element, "keyup", function () {
    observable.notifySubscribers($(element).val());
});

有了这个实现,问题是updatebindingHandlers 将被触发,但重用 observable 后面的当前值,因为这已经是输入中的值,所以没有检测到更改。

我也尝试使用,valueHasMutated但总是出错,因为我的dependantObservable 没有这个方法。

我的目标是Save changes在用户开始更改日期时显示我的按钮,但只有在他离开焦点时才真正更新输入字段中的日期(更改事件)

4

1 回答 1

0

valueUpdate选项仅适用于value绑定,因此在这种情况下对您没有帮助。

您可能希望同时处理该change事件和另一个事件,例如keyupor keydown

此外,在您的update函数调用中valueAccessor(),您可以返回您的 observable,而不是它所拥有的值。您可能希望将结果作为函数调用或使用ko.utils.unwrapObservable安全返回可观察对象和不可观察对象的值的实用程序。展开 observable 也将创建一个依赖项,因此对值的编程更新将update再次触发该函数以更新您的值。

于 2013-04-27T17:58:14.813 回答