Backbone.js模型验证仅在set-> save(不在fetch上)

时间:2011-08-12 17:54:00

标签: backbone.js

警告:我正在使用一个我无法完全控制的后端,因此我正在努力解决Backbone中的一些问题,这些问题可能会在其他地方更好地解决...不幸的是,我别无选择只能在这里处理它们!

所以,我的问题是我真的想验证表单中的用户输入(当我在Backbone模型上设置值时),但是我在新创建的对象上从API接收的模型(仅通过帖子)接受一个名称,只返回一个名称和对象id)将无法通过我的验证检查。

例如,当在数据库中创建新对象时,会将两个关键字段填充为空字符串(因此当Backbone访问API并填充模型时,它会使用空字符串填充这些键)。当用户将这些对象保存回来后编辑时,我想强制他们输入这两个键的值 - 这非常容易,因为Backbone的内置验证方法。

当然,问题在于验证是在fetch-> set(不需要的行为)和set-> save(所需行为)上启动的 - 因此新创建的模型根本不会加载。 ..Backbone收集它们,验证失败,错误触发。

所以,我的问题是:是否有一种“Backbone-y”方式只能验证set上的模型 - >保存,而不是fetch-> set?我可以使用特定的触发器来解决这个问题吗?

非常感谢任何想法。

2 个答案:

答案 0 :(得分:7)

如果您传入Backbone.Model.set

{ silent: true }将无法执行验证,而fetch将通过设置传递任何选项,因此您可以覆盖fetch或撰写您的自己的fetchSilent方法,在选项对象中传递它。

但是,您可能会遇到Backbone.Collection.fetch的问题,因为当它从服务器接收属性时,它不会使用set创建新模型。相反,它会使用model = new this.model(attrs, {collection: this});创建一个新模型,然后在对象上有validate方法时执行验证。

这有点烦人。您可以通过在集合中定义parse方法(如果您使用的方法)静默创建模型(使用{silent: true})来解决此问题,因为当Backbone.Collection.add收到完全形成时Backbone模型,它不会运行验证。 (请参阅annotated source中的_add_prepareModel方法。

这个系列以这种方式工作有点烦人,但(至少现在)就是这样。

答案 1 :(得分:4)

而不是覆盖抓取,你可以做另一件事:

验证模型时,请检查model.silent并仅验证其是否存在。

当您想要获取模型时,请执行以下操作:

var test = new MyModel({ id: '123', silent: true }); 

// in your Model validate function
validate: function(attrs) {
  if (!attrs.silent) {
    // validate logic here
  }
}

然后你可以获取模型。获得模型后,您可以取消静音,以便将来进行验证。