淘汰赛映射验证

Posted

技术标签:

【中文标题】淘汰赛映射验证【英文标题】:Knockout Mapping Validation 【发布时间】:2012-12-05 16:25:53 【问题描述】:

我正在尝试将验证附加到映射视图。 我正在使用 Knockout 映射和验证插件。 伪模型:

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

如何扩展 people observableArray 以设置验证规则和消息? 我需要验证人员和书籍子数组属性。 我发现只有使用显式模型设置的示例,没有自动映射,例如:

Name: ko.observable().extend( required: true )

然后我需要设置 ko.validatedObservable、isValid 和 validation.init,但我真的不知道如何处理/组织这个。你能提供一些帮助吗?

【问题讨论】:

【参考方案1】:

我发现至少有两种方法可以为通过 ko.mapping 插件创建的模型或视图模型对象提供验证:

    在创建某些属性时使用映射选项附加验证规则 html5 属性。这仅支持某些验证(即必需的模式)。详情请见documentation for the Knockout-Validation plugin

以上两种技术也可以结合使用。有关示例,请参阅以下fiddle。


1。使用映射选项

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

2。 HTML5 属性

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

【讨论】:

您还可以包括在数据绑定内部扩展的能力。像下面这样 data-bind="value: name.extend( required: true, email: true )"【参考方案2】:

另一种方法是在映射后扩展可观察对象。

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

【讨论】:

看起来很疯狂。你的魔法是如何运作的? viewModel 的 self.Name 属性应该是未定义的。 这个概念对我来说很好,但不能说这个确切的例子。

以上是关于淘汰赛映射验证的主要内容,如果未能解决你的问题,请参考以下文章

来自具有额外属性的 JS 的淘汰赛映射

淘汰赛映射在 jsFiddle 中被破坏

淘汰制映射插件 - 使所有对象可观察

KnockoutJS 映射插件 (observableArray)

带有按钮的表格上的敲除映射和 foreach 数据绑定,缺少对视图模型的引用?

Knockout JS映射插件没有初始数据/空表单