骨干模型验证

时间:2012-01-18 18:23:27

标签: javascript validation model backbone.js

我在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的一部分,可能会在将来的版本中发生变化。

2 个答案:

答案 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);

这有意义吗?