敲除验证仅适用于两个日期字段之一
Knockout validation only working on one of two date fields
我正在使用敲除验证,错误 class 被添加到 EndDate 字段而不是 StartDate 字段(当它不为空时)。 class 导致该字段具有红色背景。我看不出这两个领域有什么区别。类似的事情也发生在我的其他页面上。
经过进一步调查,我意识到总是页面上的第一个日期字段不起作用。如果我注释掉第一个,那么第二个将停止工作。
**编辑:作为黑客,我在第一个日期字段上方添加了这个
<input id="StartDate2" style="width: 140px;" type="hidden" data-bind="date: startDate">
它有效......但感觉真的不对。**
我在视图模型的开头有这个
ko.validation.init({
insertMessages: false,
decorateElement: true,
errorElementClass: "input-validation-error"
});
来自我的模型
startDate: KnockoutObservable<Date> = ko.observable(null).extend({ required: { message: "Please enter a start date." }, simpleDate: { message: "Please enter a valid start date." } });
endDate: KnockoutObservable<Date> = ko.observable(null).extend({ required: { message: "Please enter an end date." }, simpleDate: { message: "Please enter a valid end date." } });
从视图
<li>
<label for="StartDate" class="required_label">Start Date</label>
<input id="StartDate" style="width: 140px;" type="text" data-bind="date: startDate, valueUpdate: 'afterkeydown', class:{'input-validation-error':(!startDate.isValid() && showErrors())}" ">
</li>
<li>
<label for="EndDate" class="required_label">End Date</label>
<input id="EndDate" style="width: 140px;" type="text" data-bind="date: endDate">
</li>
这是我们的客户日期绑定处理程序
// mm/dd/yyyy format
ko.bindingHandlers.date = {
init: (element, valueAccessor) => {
$(element).mask("99/99/9999", { placeholder: "mm/dd/yyyy" });
ko.utils.registerEventHandler(element, "change", () => {
var value = valueAccessor();
if (moment(element.value).isValid()) {
value(element.value);
} else {
value(null);
}
});
ko.validation.makeBindingHandlerValidatable("date");
},
update: (element, valueAccessor, allBindingsAccessor) => {
var value = valueAccessor();
var allBindings = allBindingsAccessor();
var valueUnwrapped: any = ko.utils.unwrapObservable(value);
var pattern = allBindings.format || "MM/DD/YYYY";
var output = null;
if (valueUnwrapped !== null && valueUnwrapped !== undefined && valueUnwrapped.length > 0) {
output = moment(valueUnwrapped).format(pattern);
}
if ($(element).is("input") === true) {
$(element).val(output);
} else {
$(element).text(output);
}
}
};
您仅在其 init
函数中创建 date
自定义绑定 "validation compatible",该函数仅在 HTML 中首次使用绑定时调用。这就是验证仅适用于 second 输入的原因。
为了解决这个问题,您必须将 ko.validation.makeBindingHandlerValidatable("date");
移到 init
函数之外,并将其 放在 整个绑定处理程序声明之后
ko.bindingHandlers.date = {
//...
};
ko.validation.makeBindingHandlerValidatable("date");
我正在使用敲除验证,错误 class 被添加到 EndDate 字段而不是 StartDate 字段(当它不为空时)。 class 导致该字段具有红色背景。我看不出这两个领域有什么区别。类似的事情也发生在我的其他页面上。
经过进一步调查,我意识到总是页面上的第一个日期字段不起作用。如果我注释掉第一个,那么第二个将停止工作。
**编辑:作为黑客,我在第一个日期字段上方添加了这个
<input id="StartDate2" style="width: 140px;" type="hidden" data-bind="date: startDate">
它有效......但感觉真的不对。**
我在视图模型的开头有这个
ko.validation.init({
insertMessages: false,
decorateElement: true,
errorElementClass: "input-validation-error"
});
来自我的模型
startDate: KnockoutObservable<Date> = ko.observable(null).extend({ required: { message: "Please enter a start date." }, simpleDate: { message: "Please enter a valid start date." } });
endDate: KnockoutObservable<Date> = ko.observable(null).extend({ required: { message: "Please enter an end date." }, simpleDate: { message: "Please enter a valid end date." } });
从视图
<li>
<label for="StartDate" class="required_label">Start Date</label>
<input id="StartDate" style="width: 140px;" type="text" data-bind="date: startDate, valueUpdate: 'afterkeydown', class:{'input-validation-error':(!startDate.isValid() && showErrors())}" ">
</li>
<li>
<label for="EndDate" class="required_label">End Date</label>
<input id="EndDate" style="width: 140px;" type="text" data-bind="date: endDate">
</li>
这是我们的客户日期绑定处理程序
// mm/dd/yyyy format
ko.bindingHandlers.date = {
init: (element, valueAccessor) => {
$(element).mask("99/99/9999", { placeholder: "mm/dd/yyyy" });
ko.utils.registerEventHandler(element, "change", () => {
var value = valueAccessor();
if (moment(element.value).isValid()) {
value(element.value);
} else {
value(null);
}
});
ko.validation.makeBindingHandlerValidatable("date");
},
update: (element, valueAccessor, allBindingsAccessor) => {
var value = valueAccessor();
var allBindings = allBindingsAccessor();
var valueUnwrapped: any = ko.utils.unwrapObservable(value);
var pattern = allBindings.format || "MM/DD/YYYY";
var output = null;
if (valueUnwrapped !== null && valueUnwrapped !== undefined && valueUnwrapped.length > 0) {
output = moment(valueUnwrapped).format(pattern);
}
if ($(element).is("input") === true) {
$(element).val(output);
} else {
$(element).text(output);
}
}
};
您仅在其 init
函数中创建 date
自定义绑定 "validation compatible",该函数仅在 HTML 中首次使用绑定时调用。这就是验证仅适用于 second 输入的原因。
为了解决这个问题,您必须将 ko.validation.makeBindingHandlerValidatable("date");
移到 init
函数之外,并将其 放在 整个绑定处理程序声明之后
ko.bindingHandlers.date = {
//...
};
ko.validation.makeBindingHandlerValidatable("date");