我在Backbone.js中遇到了模型验证的奇怪行为。
首次创建模型时,如
var foo = new Foo({
bar: 42
});
Backbone调用foo.set()
作为参数传递给定地图{bar: 42}
,正如人们可以从source看到的那样。这样做时,它还会传递选项{silent: true}
,如行
this.set(attributes, {silent : true});
这是有道理的,因为让silent === true
避免触发change
事件,这在这种情况下没有意义。
出于某种原因,我无法理解,silent === true
还会阻止验证;看到该行的来源
if (!options.silent && this.validate && !this._performValidation(attrs, options)) return false;
因此,在创建模型时,模型永远不会验证,但它们通常是在某些属性发生更改时。此外,验证的存在与发送change
事件的行为密不可分,这是完全正交的事情。
任何人都可以解释为什么会这样吗?什么是解决这个问题的清洁和面向未来的方法?
我可以手动调用_performValidation
,但这有两个缺点:
_performValidation
不是API的一部分,可能会在将来的版本中发生变化。答案 0 :(得分:3)
确实我认为这是Backbone.JS上的一个错误。
GitHub上有一个未解决的问题:https://github.com/documentcloud/backbone/issues/870
编辑:在Backbone.js的新版本0.9.1中,您可以使用isValid
方法(http://backbonejs.org/#Model-isValid)测试模型是否有效
答案 1 :(得分:0)
截至目前,保持安全的唯一方法是永远不要传递参数hash。
我总是这样做:
var m = new MyModel();
// and then I do all the sets
m.set(...);
m.set(...);
m.set(...);
如果某些JSON数据来自数据库,那么它们应该已经过验证,因此在这种情况下它可以:
var m = MyMOdel(hashFromDB);
这有意义吗?