所以,我的问题是我真的想验证表单中的用户输入(当我在Backbone模型上设置值时),但是我在新创建的对象上从API接收的模型(仅通过帖子)接受一个名称,只返回一个名称和对象id)将无法通过我的验证检查。
例如,当在数据库中创建新对象时,会将两个关键字段填充为空字符串(因此当Backbone访问API并填充模型时,它会使用空字符串填充这些键)。当用户将这些对象保存回来后编辑时,我想强制他们输入这两个键的值 - 这非常容易,因为Backbone的内置验证方法。
当然,问题在于验证是在fetch-> set(不需要的行为)和set-> save(所需行为)上启动的 - 因此新创建的模型根本不会加载。 ..Backbone收集它们,验证失败,错误触发。
所以,我的问题是:是否有一种“Backbone-y”方式只能验证set上的模型 - >保存,而不是fetch-> set?我可以使用特定的触发器来解决这个问题吗?
非常感谢任何想法。
答案 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
}
}
然后你可以获取模型。获得模型后,您可以取消静音,以便将来进行验证。