Javascript 敲除验证未使用敲除自定义绑定触发
我有一个敲除自定义绑定处理程序,用于需要通过敲除验证来验证的输入。然而,我所做的一切都不起作用。未激发验证。我可以在绑定到同一viewmodel属性的输入上的普通ko值绑定上启动验证 我从我的研究中发现了什么(ko文档、ko文档和这个问题 在许多其他方面),您需要:Javascript 敲除验证未使用敲除自定义绑定触发,javascript,knockout.js,knockout-validation,Javascript,Knockout.js,Knockout Validation,我有一个敲除自定义绑定处理程序,用于需要通过敲除验证来验证的输入。然而,我所做的一切都不起作用。未激发验证。我可以在绑定到同一viewmodel属性的输入上的普通ko值绑定上启动验证 我从我的研究中发现了什么(ko文档、ko文档和这个问题 在许多其他方面),您需要: ko.validation.makeBindingHandlerValidatable("yourcustombindinghandlername"); 要进行KO验证,请注意自定义绑定处理程序。我有,但我仍然没有得到快乐 我已经
ko.validation.makeBindingHandlerValidatable("yourcustombindinghandlername");
要进行KO验证,请注意自定义绑定处理程序。我有,但我仍然没有得到快乐
我已经尝试通过knockout-validation.js对值绑定和自定义绑定进行调试,以查看发生了什么不同,但我无法确定自定义绑定验证的入口点是什么。我的js没有那么强
下面是代码的一个非常简化的版本:
HTML:
视图模型:
function JobQuoteViewModel() {
var self = this;
self.quote = {};
self.getQuote = function () {
self.quoteMapping = {
"mileage": {
create: function (options) {
return ko.observable(options.data).extend({ required: true });
}
}
}
var quoteResult = { mileage:1234 }
ko.validation.init();
ko.validation.makeBindingHandlerValidatable("vehiclemileage");
self.quote = ko.mapping.fromJS(quoteResult, self.quoteMapping);
ko.applyBindings(self);
//$.ajax({
// url: "webapplication6/Home/GetQuote",
// type: "GET",
// dataType: "JSON",
// success: function (result) {
// ko.validation.init();
// ko.validation.makeBindingHandlerValidatable("vehiclemileage");
// self.quote = ko.mapping.fromJS(result.data, self.quoteMapping);
// ko.applyBindings(self);
// }
//});
};
self.update = {
mileage: function (value) {
alert('mileage: ' + value);
}
}
self.getQuote();
}
视图模型实例化:
var jobQuoteVM = new JobQuoteViewModel();
这是上面的提琴:
在这个示例中,我有两个输入:一个绑定到自定义绑定处理程序,另一个绑定到简单值绑定。后者是为了证明普通值绑定的有效性
左侧的输入是绑定到自定义绑定处理程序的输入,右侧的输入是值绑定
TIA需要任何帮助。看起来您没有正确更新可观察到的。例如,您可以使用一个简单的计算机来执行此操作: 我稍微修改了您的自定义绑定:
ko.bindingHandlers.vehiclemileage = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var formattedValue = ko.pureComputed({
read: function () {
var text = valueAccessor()();
return text;
},
write: function (newValue) {
valueAccessor()(newValue);
}
});
ko.utils.registerEventHandler(element, "blur", function (evt) {
var modelValue = valueAccessor(),
elementValue = $(element).val();
if (ko.isWriteableObservable(modelValue)) {
formattedValue(elementValue);
}
if (evt.timeStamp !== undefined) {
var fieldName = allBindingsAccessor().fieldName;
bindingContext.$root.update[fieldName]($(element).val());
}
});
//return true;
},
update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var value = ko.utils.unwrapObservable(valueAccessor());
$(element).val(value);
//return true;
}
}
看起来您没有正确地更新可观察对象。例如,您可以使用一个简单的计算机来执行此操作: 我稍微修改了您的自定义绑定:
ko.bindingHandlers.vehiclemileage = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var formattedValue = ko.pureComputed({
read: function () {
var text = valueAccessor()();
return text;
},
write: function (newValue) {
valueAccessor()(newValue);
}
});
ko.utils.registerEventHandler(element, "blur", function (evt) {
var modelValue = valueAccessor(),
elementValue = $(element).val();
if (ko.isWriteableObservable(modelValue)) {
formattedValue(elementValue);
}
if (evt.timeStamp !== undefined) {
var fieldName = allBindingsAccessor().fieldName;
bindingContext.$root.update[fieldName]($(element).val());
}
});
//return true;
},
update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var value = ko.utils.unwrapObservable(valueAccessor());
$(element).val(value);
//return true;
}
}
如果问题有需要改进的地方,请有人告诉我。如果问题有需要改进的地方,请有人告诉我。谢谢!只是为了检查我是否正确地理解了这一点:Ko验证需要定制绑定处理程序来执行Ko绑定处理程序(例如值绑定)通常会执行的操作,以便能够检测到更改并对其进行验证。在这种情况下,我们需要更新模糊时的可观测值(值绑定更新失焦时的可观测值)。谢谢,你的回答澄清了我对KO的理解,也给了我一个解决方案。干杯是的,您正在更新输入的值,但不是可观察对象本身。感谢您的帮助并验证我的理解。谢谢您!只是为了检查我是否正确地理解了这一点:Ko验证需要定制绑定处理程序来执行Ko绑定处理程序(例如值绑定)通常会执行的操作,以便能够检测到更改并对其进行验证。在这种情况下,我们需要更新模糊时的可观测值(值绑定更新失焦时的可观测值)。谢谢,你的回答澄清了我对KO的理解,也给了我一个解决方案。干杯是的,您正在更新输入的值,但不是可观察对象本身。感谢您的帮助并验证我的理解。
ko.bindingHandlers.vehiclemileage = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var formattedValue = ko.pureComputed({
read: function () {
var text = valueAccessor()();
return text;
},
write: function (newValue) {
valueAccessor()(newValue);
}
});
ko.utils.registerEventHandler(element, "blur", function (evt) {
var modelValue = valueAccessor(),
elementValue = $(element).val();
if (ko.isWriteableObservable(modelValue)) {
formattedValue(elementValue);
}
if (evt.timeStamp !== undefined) {
var fieldName = allBindingsAccessor().fieldName;
bindingContext.$root.update[fieldName]($(element).val());
}
});
//return true;
},
update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var value = ko.utils.unwrapObservable(valueAccessor());
$(element).val(value);
//return true;
}
}