我遇到一个问题,如果我运行一个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'
答案 0 :(得分:4)
[验证方法]传递将要使用的属性 更新
所以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')