我有以下 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());
});
有了这个实现,问题是update
bindingHandlers 上的每个按键都会被触发。这通常会导致日期无效。示例:用户将在输入字段中一次输入一个数字的新日期。对于每个数字,都会触发更新,并且输入的新内容会被错误地解释。
我也试试这个:
ko.utils.registerEventHandler(element, "keyup", function () {
observable.notifySubscribers($(element).val());
});
有了这个实现,问题是update
bindingHandlers 将被触发,但重用 observable 后面的当前值,因为这已经是输入中的值,所以没有检测到更改。
我也尝试使用,valueHasMutated
但总是出错,因为我的dependantObservable 没有这个方法。
我的目标是Save changes
在用户开始更改日期时显示我的按钮,但只有在他离开焦点时才真正更新输入字段中的日期(更改事件)