在一个实例建立时,在骨干模型验证仅做了什么?(Is Validation on Models in

2019-09-28 18:01发布

我已经创建了一个对象:

var Person = Backbone.Model.extend({
  defaults: {
    'name': '',
    'age': 0
  },
  initialize: function() {
    this.on('error', function(model, error){
      console.log(error);
    });
  },
  validate: function(attributes){
    if (attributes.name == '') {
      return "How do we call him!?";
    }
  },
  changeName: function(name) {
    this.set({'name':name});
  },
  getOlder: function() {
    this.set({'age': this.get('age') +1});
  }   
});

我创建一个Person的实例,并放置在一个空白的名字,我从来没有收到一个错误。 但是,当我在已创建的实例设置一个空白名称,它打响了验证。

var teejay = new Person;
teejay.changeName('');
=> How do we call him!?
teejay.get('name');
=> ""

从什么我从骨干源代码看,我看

this.set(attributes, {silent: true});

它是正确的假设,验证只是做每当属性被更改或设置?

Answer 1:

骨干网将始终调用validate方法时,你setsave属性与当你在一个哈希传递给构造函数或当模型的实例之外default哈希值。

var myperson = new Person({name: ''});

不会叫的validate方法,因为构造函数必须返回模型的新实例。

然而,

var myperson = new Person();
myperson.set('name', '');

将。

您的validate方法永远不会打印出任何东西-在return上验证用于测试它是否工作。 如果返回任何东西“truthy”验证将失败,但仅此而已。 它是由你来触发'error'你想留言或任何其他。

你看到的是完全一样的,应预期。

TL; DR:您的defaults哈希永远不会被验证,因为它必须返回一个有效的模式。

(另外,请允许我抬价我Backbone.Validator现在的项目-不要写你自己的!)



文章来源: Is Validation on Models in Backbone only done when set on an instance?