1

以下代码有什么问题?

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

输出:

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 

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

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

4

4 回答 4

6

在当前版本的 Backbone.js 中:

默认情况下 validate 在保存之前调用,但如果 {validate:true} 被传递,也可以在设置之前调用。

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

yourmodel.set('someproperty', 14, {validate: true});

我希望我的回答对您有所帮助。

于 2013-11-14T20:15:33.457 回答
3

使用新版本,保存新数据时,需要通过验证选项:

task.save({ priority: -9 }, {validation: true});
于 2013-03-29T10:02:03.990 回答
1

这是官方网站代码的问题。查看save函数的来源,我了解到在调用之后会发生options.validateto的预设。trueset

您可以尝试切换行的顺序(在save函数中Model):

  if (attrs && (!options || !options.wait) && !this.set(attrs, options)) return false;

  options = _.extend({validate: true}, options);

到:

   options = _.extend({validate: true}, options);

   if (attrs && (!options || !options.wait) && !this.set(attrs, options)) return false;

但我不确定它不会破坏其他东西。

或者您可以使用来自 GitHub 存储库的代码 - 有一个更改可以解决这个问题。

于 2013-04-03T23:16:57.290 回答
0

好的,您只需将标志“等待”设置为真或将“验证”标志设置为真。如何?好吧,如果您不将等待标志设置为 true,则将使用您在验证之前通过 save 方法的选项调用 set 方法。因此,由于您不需要传递 validate 标志,因此 set 方法不会接收它,不运行验证并设置属性。
由于文档不清楚等待标志:您的服务器仍将收到更新的数据。

于 2013-03-29T16:52:02.790 回答