Knockout-validation.js - 使用jQuery设置所需的属性失败验证

时间:2013-07-11 20:46:48

标签: knockout.js knockout-validation

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

1 个答案:

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

Credit for above