【问题标题】:Backbone: Validations being run only on set() parametersBackbone:验证仅在 set() 参数上运行
【发布时间】:2012-01-06 07:02:52
【问题描述】:

我有一个问题,如果我运行 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”

【问题讨论】:

  • 这是用于非当前版本的 Backbone 吗?根据我的调试,看起来整个模型的属性都被发送到 validate() 因为 Backbone.Model._validate() 中的这一行:“attrs = _.extend({}, this.attributes, attrs);”
  • 是的 - 自从写这篇文章以来,主干已经发生了显着变化。

标签: javascript validation backbone.js coffeescript


【解决方案1】:

来自backbone docs

[验证方法] 传递了即将被传递的属性 更新了

所以attrs 对象正确地只包含new_field。如果您想访问模型的其他字段,您可能可以这样做this.get("first_field");

【讨论】:

    【解决方案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')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-22
      相关资源
      最近更新 更多