我正在尝试将验证附加到映射视图。 我正在使用Knockout Mapping and Validation插件。 伪模型:
Person {
int Id;
string Name;
Book[] Books;
}
Book {
int Id;
string Name;
}
使用Javascript:
function viewModel() {
var self = this;
self.persons = ko.observableArray();
// persons are retrieved via AJAX...
ko.mapping.fromJS(persons, {}, self.persons);
}
jQuery(function( $ ) {
ko.applyBindings(new viewModel());
});
如何扩展observableArray人员以设置验证规则和消息? 我需要验证人员和书籍子数组属性。 我发现只有使用显式模型设置的示例,没有自动映射,例如:
Name: ko.observable().extend({ required: true })
然后我需要设置ko.validatedObservable,isValid和validation.init,但我真的不知道如何处理/组织它。你能帮忙吗?
答案 0 :(得分:30)
我找到了至少两种方法来提供验证来建模或查看通过ko.mapping插件创建的模型对象:
也可以组合上述两种技术。有关示例,请参阅以下fiddle。
Knockout Mapping插件允许在要定制的映射对象上创建某些属性。利用此功能,您可以覆盖插件的默认行为并为映射的属性添加验证。以下是一个例子
<强> HTML 强>
<input data-bind="value: name" />
的的Javascript 强>
var data = { name: "Joe Shmo" };
var validationMapping = {
// customize the creation of the name property so that it provides validation
name: {
create: function(options) {
return ko.observable(options.data).extend( {required: true} );
}
}
};
var viewModel = ko.validatedObservable(ko.mapping.fromJS(data, validationMapping));
ko.applyBindings(viewModel);
Knockout Validation插件支持一组有限的HTML5验证属性,可以在HTML控件中使用。但是,使用它们需要启用parseInputAttributes
选项。这是一个简单的例子:
<强> HTML 强>
<input data-bind="value: name" required />
的的Javascript 强>
// this can also be configured through the "validationOptions" binding (https://github.com/ericmbarnard/Knockout-Validation/wiki/Validation-Bindings)
ko.validation.configure({
parseInputAttributes: true
});
var data = { name: "Joe Shmo" };
var viewModel = ko.validatedObservable(ko.mapping.fromJS(data));
ko.applyBindings(viewModel);
答案 1 :(得分:4)
另一种方法是在映射后扩展observable。
function viewModel() {
var self = this;
self.persons = ko.observableArray();
// persons are retrieved via AJAX...
ko.mapping.fromJS(persons, {}, self.persons);
self.Name.extend({ required: true });
}