Backbone - 未调用模型验证,未捕获“无效”事件

时间:2013-01-26 13:51:14

标签: validation backbone.js event-handling marionette

我正在使用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;
        }

    });

1 个答案:

答案 0 :(得分:5)

验证逻辑在Backbone 0.9.10中已更改。从change log引用,验证现在的工作原理如下:

  

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

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

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

Backbone中的模型验证是基于Backbone没有在模型上定义名为validate的方法的意义上的约定 - 您自己做。但是,如果您已经定义了这样的方法,Backbone将在验证发生时(save或带validate:true的构造函数/ setter)为您调用它,并且invalid事件将被触发