Backbone.js模型验证不起作用

Zuh*_*aib 1 model-validation backbone.js

以下代码有什么问题?

(function(){

    window.App = {
        Models: {},
        Collections: {},
        Views: {}
    };

    window.template = function(id) {
        return _.template($('#' + id).html());
    };

    App.Models.Task = Backbone.Model.extend({
        defaults:{
            title: '',
            priority: 0
        },

        validate: function(attrs, options){
            if (attrs.priority < 0){
                return 'Priority cannot be negative.';
            }
        }
    });

    var task = new App.Models.Task ({ title: 'Sample Task', priority: 5 });
    task.on('invalid', function(model, error) { console.log(error); })

    task.save({ priority: -9 }); // Should not pass validation
    console.log(task.validationError); // Prints a validation error

    console.log(task.toJSON()); // Model is updated with -9
    console.log(task.isValid()); // false
})();
Run Code Online (Sandbox Code Playgroud)

输出:

Priority cannot be negative. app.js:27
Priority cannot be negative. app.js:30
Object {title: "Sample Task", priority: -9} app.js:32
Priority cannot be negative. app.js:27
false 
Run Code Online (Sandbox Code Playgroud)

我目前正在观看视频教程,它基于老版本的backbone.js,默认情况下对该set方法强制执行验证.但在当前版本中,默认情况下会对该save方法强制执行验证.

但即使它不是有效值并且验证未通过,为什么它仍然将值设置为-9.当验证没有通过时,不应该设置值吗?

zuz*_*nen 6

在当前版本的Backbone.js中:

默认情况下,在保存之前调用validate,但如果传递了{validate:true},也可以在set之前调用.

因此,为了在您的方法上调用此方法,您应该在模型上设置属性时将validate设置为true,如下所示:

yourmodel.set('someproperty', 14, {validate: true});
Run Code Online (Sandbox Code Playgroud)

我希望我的回答很有帮助.