Javascript 主干:仅对set()参数运行验证
我有一个问题,如果我运行model.set({field:'value'}),该模型的验证将运行,就好像显式指定的字段是该模型的唯一参数集一样 我的意思是,如果我有一个需要字段'first_field'和'second_field'存在的验证,运行model.set({third_field:'value'})将失败验证,即使已经设置了first_field和second_field。在console中,第一个_字段和第二个_字段在验证运行之前和之后都可用…但是console.log的(attrs)字段仅由验证函数中的第三个字段填充 从我在官方文档中读到的内容来看,我的验证方法模式是好的……但显然有些地方出了问题。欢迎提出任何想法,代码如下: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
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发生了显著的变化。