我在knockout.js中实现了一个相当常见的场景,复制了一个表单。用户填写“联系人”表单,然后通过单击复选框,他们可以选择在“结算”表单上使用相同的值。这使用jQuery迭代联系表单,并将相同名称的计费表单输入设置为相同的值。
这是一个精简的小提琴that shows the problem;尝试填写联系表单,然后单击“与联系人信息相同”复选框。结算表单将填写,但您会在点击“验证结算”按钮时看到结算表单中的每个字段都无法通过验证。如果在表单中手动键入值,则验证成功。
我的问题是,为什么敲门验证不会检测到从联系表单中复制后的结算表格中的值?复制后,尽管有值,但必需的字段未通过验证。如何进行敲除验证检测到字段值已发生变化?
我的模型正在使用烘焙验证规则:
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.");
}
};
答案 0 :(得分:0)
发现问题;使用.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());
});