KnockoutJS表单验证始终返回有效

时间:2014-01-09 19:04:53

标签: json knockout.js knockout-validation

我有一张表格:

enter image description here

并实施KnockoutJS验证。一切都是通过遵循文档来应用的,但它总是返回,即使我留下空字段等也是有效的。

这是代码:

ko.validation.rules.pattern.message = 'Invalid.';

ko.validation.configure({
    registerExtenders: true,
    messagesOnModified: true,
    insertMessages: true,
    parseInputAttributes: true,
    messageTemplate: null
});

var initialData = [
    { firstName: "John", fathersLast: "Smith", country : ""
    }
];

var Contact = function (contact) {
            var self = this;
            self.firstName = ko.observable(contact.firstName ).extend({ required: true,  message: '* required'  });;
            self.fathersLast = ko.observable(contact.fathersLast ).extend({ required: true, message: '* required'  });;
    self.country = ko.observable(contact.country ).extend({ required: true, minLength: 2, message: '* required'  });
        };

var ContactsModel = function(contacts) {
    var self = this;

    self.contacts = ko.observableArray(ko.utils.arrayMap(contacts, function(i) {
        return new Contact(i);
    }));


    self.errors = ko.validation.group(self.contacts);

    self.addContact = function() {

        if (self.errors().length == 0) {
            alert('Thank you.');
        } else {
            alert('Please check your submission.');
            self.errors.showAllMessages();
        }

        self.contacts.push({
            firstName: "",
            fathersLast: "",
            country: ""
        });
    };

    self.removeContact = function(contact) {
        self.contacts.remove(contact);
    };
};

ko.applyBindings(new ContactsModel(initialData));

以下是工作示例:http://jsfiddle.net/8Hude/3/

任何线索为什么它不能正常工作?

感谢。

1 个答案:

答案 0 :(得分:0)

如上所述,验证插件将是最优雅,更少创新的解决方案。

编辑:使用验证插件的评论实施后

除此之外,你还有几个选择。

如果您确信联系对象将始终只包含必填字段,那么不太强大的实现将迭代联系人的属性,确保每个都具有一定的价值。

稍微强一点,但仍然缺乏插件的优雅,实现将是维护一系列必需字段并使用该数组进行验证。您可以参考我的示例进行此设置。实质上,每个必需属性都映射到observables。对任何可观察属性的值所做的更改会触发(通过订阅)对计算中使用的虚拟可观察对象的突变调用。这是必需的,因为计算机不能调用valueHasMutated。变异调用触发计算重新评估,从而更新UI。