1

我创建了一个对象:

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

假设仅在更改或设置属性时才进行验证是否正确?

4

1 回答 1

1

Backbone 将始终在您或属性时调用该validate方法,但当您将哈希传递给构造函数或模型使用哈希实例化时除外。setsavedefault

例如

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

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

然而,

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

将要。

你的validate方法永远不会打印出任何东西return——on validate 用于测试它是否有效。如果您返回任何“真实”验证将失败,但仅此而已。由您来触发'error'消息或您想要的任何其他内容。

您所看到的完全符合预期。

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

(另外,请允许我现在为我的Backbone.Validator项目提供服务——不要自己编写!)

于 2012-10-01T17:37:30.650 回答