Backbone:仅在set()参数上运行验证

时间:2012-01-05 21:07:27

标签: javascript validation backbone.js coffeescript

我遇到一个问题,如果我运行一个model.set({field:'value'}),该模型的验证将运行,就好像显式指定的字段是模型的唯一参数集一样。

我的意思是,如果我的验证要求存在字段'first_field'和'second_field',则运行model.set({third_field:'value'})将无法验证,即使first_field和second_field具有已经设定好了。从控制台,first_field和second_field在运行验证之前和之后都可用...但是console.log的(attrs)字段仅由validate函数中的第三个字段填充。

从我在官方文档中看到的,我的验证方法模式很好......但是有些事情显然是错误的。任何想法都赞赏,代码如下:

class MyModel extends Backbone.Model
  # ...
  validate: (attrs) ->
    errors = []
    valid = true
    console.log attrs
    if (!attrs.first_field)
      errors.push('You must add a first field')
    if (errors.length > 0)
      return errors
  # ...

从控制台,如果我跑

m = window.router.my_models.test_model  # Contains attributes 'first_field' and 'second_field'
m.set({new_field: 'test value'})

它将返回一个'false',它来自验证。 validate方法中的attrs上的console.log确认唯一的attrs值是明确设置'new_field'

2 个答案:

答案 0 :(得分:4)

来自backbone docs

  

[验证方法]传递将要使用的属性   更新

所以attrs对象只能包含new_field。如果要访问模型的其他字段,可以执行this.get("first_field");

答案 1 :(得分:2)

只有正在更改的属性才会传递给validate方法,在您的示例中为new_field

可以轻松修复验证方法以查看是否存在first_field

而不是

if (!attrs.first_field)
  errors.push('You must add a first field')

替换为

if (!this.get('first_field'))
  errors.push('You must add a first field')