我在knockout.js中实现了一个相当常见的场景,即复制表单。用户填写“联系人”表单,他们可以通过单击复选框来选择在“帐单”表单上使用相同的值。它使用jQuery遍历contact表单,并将同名的账单表单输入设置为相同的值。
这是一个精简的that shows the problem;尝试填写联系人表单,然后单击“与联系人信息相同”复选框。账单表单将会填写,但当您单击“验证账单”按钮时,您将看到账单表单中的每个字段都未通过验证。如果在表单中手动键入值,则验证成功。
我的问题是,为什么knockout-validation在从contact表单复制后没有检测到账单表单中的值已被设置?复制后,尽管有值,但必填字段未通过验证。如何让knockout-validation检测到字段值已更改?
我的模型使用的是烘焙的淘汰验证规则:
self.errors = ko.validation.group(this, {
deep: true,
observable: false
});
self.firstName = ko.observable().extend({
required: true
});值是通过jQuery的val()设置的:
$(":input[name]", contactForm).each(function () {
$("[name=" + $(this).attr("name") + "]", billingForm).val($(this).val());
});测试验证的按钮很简单:
self.validateBilling = function () {
self.errors.showAllMessages();
if (self.errors().length == 0) {
alert("No billing validation errors.");
}
};发布于 2013-07-12 05:00:41
发现了问题;使用.val()设置输入值不会导致触发onchange()。在设置值时触发更改解决了这个问题。
$.fn.changeVal = function (v) {
return $(this).val(v).trigger("change");
};
$(":input[name]", contactForm).each(function () {
$("[name=" + $(this).attr("name") + "]", billingForm).changeVal($(this).val());
});https://stackoverflow.com/questions/17603199
复制相似问题