0

我在 knockout.js 中实现了一个相当常见的场景,即复制表单。用户填写“联系”表单,然后他们可以通过单击复选框来选择在“计费”表单上使用相同的值。它使用 jQuery 遍历联系表单,并将同名的计费表单输入设置为相同的值。

这是一个显示问题的精简小提琴;尝试填写联系表格,然后单击“与联系信息相同”复选框。帐单将填写,但是当您单击“验证帐单”按钮时,您会看到帐单中的每个字段都未通过验证。如果您在表单中手动键入值,则验证成功。

我的问题是,为什么剔除验证没有检测到帐单表单中的值在从联系表单复制后已设置?复制后,尽管有值,但必填字段无法验证。如何让淘汰赛验证检测到字段值已更改?

我的模型使用的是淘汰验证规则:

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.");
    }
};
4

1 回答 1

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());
    });

以上信用

于 2013-07-11T21:00:41.440 回答