Backbone.js模型仅在集合上验证->;保存(不在获取时)
警告:我正在使用一个我无法完全控制的后端,因此我正在努力解决主干中的一些问题,这些问题可能在其他地方得到更好的解决……不幸的是,我别无选择,只能在这里处理它们 所以,我的问题是,我真的很想验证表单中的用户输入(当我在主干模型上用它设置值时),但是我从新创建的对象上的API接收的模型(通过只接受名称并且只返回名称和对象id的帖子)将无法通过我的验证检查 例如,当在数据库中创建一个新对象时,两个键字段将填充为空字符串(因此,当主干命中API并填充模型时,它将用空字符串填充这些键)。当用户保存这些对象时,在编辑后,我想强制他们为这两个键输入值——这非常容易,因为主干网内置了验证方法 当然,问题是验证同时在fetch->set(不需要的行为)和set->save(需要的行为)上启动,因此新创建的模型根本不会加载……主干网收集它们,验证失败,并触发错误 所以,我的问题是:是否有一种“主干-y”方法只在set->save上验证模型,而不是在fetch->set上验证模型?我可以用一个特定的触发器来解决这个问题吗Backbone.js模型仅在集合上验证->;保存(不在获取时),backbone.js,Backbone.js,警告:我正在使用一个我无法完全控制的后端,因此我正在努力解决主干中的一些问题,这些问题可能在其他地方得到更好的解决……不幸的是,我别无选择,只能在这里处理它们 所以,我的问题是,我真的很想验证表单中的用户输入(当我在主干模型上用它设置值时),但是我从新创建的对象上的API接收的模型(通过只接受名称并且只返回名称和对象id的帖子)将无法通过我的验证检查 例如,当在数据库中创建一个新对象时,两个键字段将填充为空字符串(因此,当主干命中API并填充模型时,它将用空字符串填充这些键)。当用户保存这些对象
任何想法都将不胜感激。
主干.Model.set
如果传入{silent:true}
,则不会执行验证,fetch
会将任何选项传递给set,因此,您可以重写fetch
,或者编写自己的fetchSilent
方法,在options对象中传递该方法
但是,您可能会在使用Backbone.Collection.fetch
时遇到一些小问题,因为当它从服务器接收属性时,它不会使用set
创建新模型。相反,它使用model=newthis.model(attrs,{collection:this})创建一个新模型如果对象上有validate
方法,则执行验证
这有点烦人。您可以通过在集合(如果您正在使用)上定义一个parse
方法(使用{silent:true}
)来绕过它,因为当Backbone.collection.add
收到一个完全形成的主干模型时,它不会运行验证。(请参阅中的\u add
和\u prepareModel
方法)
集合以这种方式工作有点烦人,但(至少现在)它就是这样。您可以做另一件事,而不是覆盖fetch:
验证模型时,请检查是否存在model.silent
,并仅在该模型不存在时进行验证
因此,当您要获取模型时,请执行以下操作:
var test = new MyModel({ id: '123', silent: true });
// in your Model validate function
validate: function(attrs) {
if (!attrs.silent) {
// validate logic here
}
}
然后你可以取回模型。获得模型后,您可以取消设置静默,以备将来验证。确实很烦人,但感谢您提供的提示--非常感谢。据我所知,在最新的源代码中,即使通过静默设置,主干也会在设置时进行验证,所以这不会有帮助