【发布时间】:2015-06-25 00:01:17
【问题描述】:
我创建了一个 Knockout 自定义绑定来使用 moment.js 格式化日期。
ko.bindingHandlers.dateStringValue = {
update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
var value = valueAccessor(),
allBindings = allBindingsAccessor();
var valueUnwrapped = ko.utils.unwrapObservable(value);
if (valueUnwrapped === null) {
ko.bindingHandlers.value.update(element, valueAccessor, allBindingsAccessor, viewModel);
$(element).val("");
} else {
ko.bindingHandlers.value.update(element, valueAccessor, allBindingsAccessor, viewModel);
var pattern = allBindings.datePattern || "MM/DD/YYYY";
$(element).val(moment(valueUnwrapped).format(pattern));
}
}
};
这对我的绑定很有效:
<input type="text" data-bind="dateStringValue: entryDate, datePattern: 'M/D/YYYY'" />
我从网上找到的代码创建了一个自定义验证规则。
// http://stackoverflow.com/a/23086828/139917
// Use: var someDate= ko.observable().extend({ simpleDate: true });
// Dependencies: date.js
ko.validation.rules['simpleDate'] = {
validator: function (val, validate) {
var d = Date.parse(val);
return (d != null);
//return ko.validation.utils.isEmptyVal(val) || moment(val, 'MM/DD/YYYY').isValid();
},
message: 'Invalid date entry date'
};
ko.validation.registerExtenders();
我尝试了 moment.js 和 date.js 日期库。
我将自定义验证规则附加到我的 viewmodel observable。
self.entryDate = ko.observable(je.entryDate || new Date()).extend({ simpleDate: true });
现在我想使用 Knockout Validation 来验证输入,但不知道如何让验证框架知道我的新绑定。似乎 Knockout Validation 只知道部分或全部内置的 Knockout 绑定。
在 Knockout v3.2.0 中调用 ko.validation.makeBindingHandlerValidatable("dateStringValue"); 会引发 0x800a138f - JavaScript runtime error: Object expected 错误。有人建议从我的自定义绑定中调用 Knockout 值绑定可以工作,但像 ko.bindingHandlers.value.update(element, valueAccessor); 这样的代码对我不起作用。
如何让 Knockout Validation 知道我的自定义绑定?
【问题讨论】:
标签: javascript knockout.js knockout-validation