4

我正在使用 Backbone 和 Marionette,我正在从后端检索我的模型。
这些模型属于一个集合。问题是:

1) 除非在初始化中显式调用,否则永远不会调用 validate 方法。为什么?
2) 当我显式调用 validate 方法时,它会正确返回我为测试创建的无效模型。但我无法捕捉到“无效”事件。我究竟做错了什么?

这是模型:

 var Job = Backbone.Model.extend({
    validate: function(attrs){
        if (! attrs.title ) {
            return "A job should have a title";
        }
    },

    initialize: function(){

        this.validate(this.attributes); //manual call to validate
        this.on("invalid",  function(model, error){ //never executed even when the validate model returns the error string
            console.log(error);
        });

    }

});

这里是集合:

var JobList = Backbone.Collection.extend({
        model: Job,
        url: '/api/1.0/jobs/',
        parse: function(response) {
          return response.results;
        }

    });
4

1 回答 1

5

Backbone 中的验证逻辑已更改0.9.10。引用更改日志,验证现在的工作方式如下:

模型验证现在仅在 Model#save 中默认强制执行,并且在构造或 Model#set 中不再默认强制执行,除非通过了 {validate:true} 选项。

因此,如果您希望在初始化时验证模型,或者set,您需要将选项传递validate:true给构造函数/方法。

invalid手动调用方法时未收到事件的原因model.validate是 Backbone未在您执行任何验证时执行任何验证。您调用在模型上定义的方法,而 Backbone 对此一无所知。

Model validation in Backbone is convention based in the sense that Backbone doesn't define a method called validate on the model - you do yourself. However, if you have defined such a method, Backbone will call it for you when validation occurs (on save, or in constructor/setter with validate:true, and the invalid event will be triggered.

于 2013-01-26T13:59:18.663 回答