Javascript 主干:仅对set()参数运行验证

Javascript 主干:仅对set()参数运行验证,javascript,validation,backbone.js,coffeescript,Javascript,Validation,Backbone.js,Coffeescript,我有一个问题,如果我运行model.set({field:'value'}),该模型的验证将运行,就好像显式指定的字段是该模型的唯一参数集一样 我的意思是,如果我有一个需要字段'first_field'和'second_field'存在的验证,运行model.set({third_field:'value'})将失败验证,即使已经设置了first_field和second_field。在console中,第一个_字段和第二个_字段在验证运行之前和之后都可用…但是console.log的(attr

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

我的意思是,如果我有一个需要字段'first_field'和'second_field'存在的验证,运行model.set({third_field:'value'})将失败验证,即使已经设置了first_field和second_field。在console中,第一个_字段和第二个_字段在验证运行之前和之后都可用…但是console.log的(attrs)字段仅由验证函数中的第三个字段填充

从我在官方文档中读到的内容来看,我的验证方法模式是好的……但显然有些地方出了问题。欢迎提出任何想法,代码如下:

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方法中的一个console.log on attrs确认存在的唯一attrs值是显式设置“new_field”

来自:

[验证方法]被传递给将要验证的属性 更新


因此,
attrs
对象正确地只包含
new\u字段
。如果您想访问模型的其他字段,您可能需要执行
this.get(“first_field”)

仅将正在更改的属性传递给
验证
方法,在您的示例中,该方法是
新建字段

更新验证方法以查看是否存在
first\u字段
,这是一个简单的修复方法

而不是

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')

这是用于非当前版本的主干网吗?根据我的调试,整个模型的属性似乎被发送到validate(),因为Backbone.model.\u validate():“attrs=\uu.extend({},this.attributes,attrs);”是-自编写此命令以来,Backbone发生了显著的变化。