2011-08-12 146 views
8

注意:我正在处理一个后端,我没有完全控制,所以我在Backbone中考虑了一些注意事项,可能会在其他地方更好地解决...不幸的是,我不得不在这里处理它们!因此,我的问题是我真的很想验证表单中的用户输入(当我在Backbone模型上设置值时),但是我从API上接收到的新创建对象的模型(通过帖子只接受一个名称,并且只返回一个名称和对象id)将会失败我的验证检查。例如,当在数据库中创建一个新对象时,两个关键字段被填充为空字符串(所以当Backbone命中API并填充模型时,它会用空字符串填充这些键)。当用户保存这些对象后,编辑后,我想迫使他们输入这两个键的值 - 这很容易,给定Backbone的内置验证方法。Backbone.js模型验证仅在set-> save(而不是获取)

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

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

任何想法将不胜感激。如果您在{ silent: true }通过

回答

7

Backbone.Model.set不会执行验证,并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方法)。

有点烦人的是,收集的作品,但(至少现在)它是这样。

+0

确实令人讨厌,但感谢提示 - 非常感谢。 – ltd

+0

就我所见,在最新的源代码骨干中,即使在静默通过时设置也会进行验证,因此不会有帮助 –

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 
    } 
} 

然后你就可以获取模型:

所以,当你想获取一个模型,你做到以下几点。获得模型后,您可以取消静默,以供将来验证。

相关问题