backbone.js – 骨干:逐个验证属性

前端之家收集整理的这篇文章主要介绍了backbone.js – 骨干:逐个验证属性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要验证一个表单中的一堆输入.而且,如果输入无效,则以特定属性无效的形式进行目视指示.为此,我需要单独验证每个表单元素.

我有一个模型&一个表示整个表格的视图.现在当我更新一个属性

this.model.set('name',this.$name.val())

将对模型的验证方法进行调用.

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

那么,如何只验证一个属性

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

我也认为这是一个更大的问题:

Whenever you use model.set() to set an attribute on the model,your validation method is run and all attributes are validated. This seems counterintuitive as you just want that single attribute to be validated.

解决方法

验证用于保持模型处于有效状态,除非您传递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
});

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

var M=Backbone.Model.extend({
    defaults:{
        name:"",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",err) {
    console.log(err);
});

if (!obj.validate({name:"name"}))
    obj.set({name:"name"},{silent:true});

猜你在找的JavaScript相关文章