微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/js/154905.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐