Backbone:逐个验证属性

tre*_*der 10 backbone.js

我需要验证一个包含大量输入的表单.并且,如果输入无效,请在表单中以可视方式指示特定属性无效.为此,我需要单独验证每个表单元素.

我有一个模型和一个代表整个表单的视图.现在,当我更新属性时:

this.model.set('name', this.$name.val())
Run Code Online (Sandbox Code Playgroud)

将调用模型上的validate方法.

但是,在该方法中,我正在验证所有属性,因此在设置上述属性时,所有其他属性也会被验证,如果任何一个属性无效,则返回错误.这意味着即使我的"名称"属性有效,我也会收到其他人的错误.

那么,我该如何验证一个属性呢?

我认为不可能通过validate()方法验证一个属性.一种解决方案是不使用validate方法,而是验证'change'事件的每个属性.但是这会产生很多改变处理程序.这是正确的方法吗?我还可以做些什么?

我也认为这表明骨干中存在更大的问题:

无论何时用于model.set()在模型上设置属性,都会运行验证方法并验证所有属性.这似乎违反直觉,因为您只需要验证单个属性.

nik*_*shr 9

Validate用于使模型保持有效状态,除非您传递silent:true选项,否则不会让您设置无效值.

您可以一次性设置所有属性:

var M=Backbone.Model.extend({
    defaults:{
        name:"",
        count:0
    },

    validate: function(attrs) {
        var invalid=[];
        if (attrs.name==="") invalid.push("name");
        if (attrs.count===0) invalid.push("count");

        if (invalid.length>0) return invalid;
    }
});

var obj=new M();
obj.on("error",function(model,err) {
    console.log(err);
});
obj.set({
    name:"name",
    count:1
});
Run Code Online (Sandbox Code Playgroud)

或者在设置它们之前逐个验证它们

var M=Backbone.Model.extend({
    defaults:{
        name:"",
        count:0
    },

    validate: function(attrs) {
        var invalid=[];
        if ( (_.has(attrs,"name"))&&(attrs.name==="") )
            invalid.push("name");
        if ( (_.has(attrs,"count"))&&(attrs.count===0) )
            invalid.push("count");

        if (invalid.length>0) return invalid;
    }
});

var obj=new M();
obj.on("error",function(model,err) {
    console.log(err);
});

if (!obj.validate({name:"name"}))
    obj.set({name:"name"},{silent:true});
Run Code Online (Sandbox Code Playgroud)