骨干模型验证

Backbone model validation

本文关键字:验证 模型      更新时间:2023-09-26

我在Backbone.js.中遇到了一个奇怪的模型验证行为

首次创建模型时,如

var foo = new Foo({
    bar: 42
});

Backbone调用foo.set(),将给定的映射{bar: 42}作为参数传递,正如可以从源代码中看到的那样。在此过程中,它还传递选项{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的一部分,它可能会在未来的版本中发生变化

事实上,我认为这是Backbone.JS.上的一个错误

GitHub上有一个悬而未决的问题:https://github.com/documentcloud/backbone/issues/870

编辑:在新版Backbone.js 0.9.1中,您可以使用isValid方法测试模型是否有效(http://backbonejs.org/#Model-isValid)

到目前为止,保持安全的唯一方法是永远不要传入参数哈希。

我总是这样做:

var m = new MyModel();
// and then I do all the sets
m.set(...);
m.set(...);
m.set(...);

如果一些JSON数据来自数据库,那么它们应该已经过验证,所以在这种情况下,可以:

var m = MyMOdel(hashFromDB);

这有道理吗?