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@H_301_21@ 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相关文章