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

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...