【问题标题】:Backbone model validation骨干模型验证
【发布时间】:2012-02-13 11:26:17
【问题描述】:

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

【问题讨论】:

    标签: javascript validation model backbone.js


    【解决方案1】:

    确实,我认为这是 Backbone.JS 的一个错误。

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

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

    【讨论】:

    • 0.9.9 版更新:现在即使在“静默”更改期间也会进行验证。此更改意味着 isValid 方法已被删除。即使在选项中指定了错误回调,失败的验证也会触发错误。
    【解决方案2】:

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

    我总是这样:

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

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

    var m = MyMOdel(hashFromDB);
    

    这有意义吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 2014-06-25
      • 2012-05-04
      相关资源
      最近更新 更多