【问题标题】:Backbone validate function not getting called没有调用主干验证功能
【发布时间】:2013-01-21 18:58:03
【问题描述】:

我的验证函数没有在下面的代码中被调用:-

var Vehicle = Backbone.Model.extend({
    color: 'green',
    validate: function (attrs) {
        var validColors = ['white', 'red', 'blue', 'yellow'];
        var colorIsValid = function (attrs) {
            if (!attrs.color) return true;
            return _.contains(validColors, attrs.color);
        }
        if(!colorIsValid(attrs)) {
            return "color must be one of: " +validColors.join(",");
        }
    }
});

var car = new Vehicle();

car.on('error', function (model, error) {
    console.log(error);
});

console.log(car.get('color'));
car.set('color', 'muave');

请看小提琴 http://jsfiddle.net/vineet85/Fa8jr/5/

谁能告诉我为什么没有调用验证函数?

【问题讨论】:

    标签: backbone.js


    【解决方案1】:

    在 Backbone.js 中,validate 会在 save 上自动调用,但不会在 set 上调用。

    如果您希望在设置值时运行验证,则需要使用validate 选项。例如

    car.set('color', 'muave', {validate: true});
    

    http://backbonejs.org/#Model-validate

    error 事件在尝试保存对象时发生错误时触发,通常是在服务器上。见http://backbonejs.org/#Events-catalog

    如果您想捕获验证失败,请尝试处理 invalid 事件:

    car.on('invalid', function (model, error) {
        console.log(error);
    });
    

    【讨论】:

    • 您期望发生什么?我认为现在调用了您的 validate 方法。如果您想知道为什么没有错误被写入控制台,那是因为错误事件没有被触发。查看更新的答案。
    • @Vineet,说你的小提琴仍然不起作用,你的意思是错误信息(“color must be one: white,red,blue,yellow” ) 没有打印在控制台日志上?我注意到在你的小提琴中你仍然使用事件 error 而不是 invalid 就像史蒂夫的回答一样。
    【解决方案2】:

    似乎需要编写一些额外的代码来运行验证。 如下:

    car.set('color', 'muave', {validate:true});
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多