【问题标题】:Backbone.js model validation only on set->save (not on fetch)Backbone.js 模型验证仅在 set->save 上(不在 fetch 上)
【发布时间】:2011-08-12 17:54:00
【问题描述】:

警告:我正在使用我无法完全控制的后端,因此我正在努力解决 Backbone 中可能在其他地方更好地解决的一些注意事项......不幸的是,我别无选择,只能在这里处理它们!

所以,我的问题是我真的很想验证来自表单的用户输入(当我在 Backbone 模型上使用它设置值时),但是我从新创建对象的 API 收到的模型(通过仅接受一个名称,并且只返回一个名称和对象 ID)将无法通过我的验证检查。

例如,当在数据库中创建一个新对象时,两个关键字段被填充为空字符串(因此,当 Backbone 访问 API 并填充模型时,它会使用空字符串填充这些键)。当用户将这些对象保存回来并进行后期编辑时,我想强制他们为这两个键输入值——考虑到 Backbone 的内置验证方法,这非常容易。

当然,问题在于验证同时在 fetch->set(不需要的行为)和 set->save(期望的行为)上触发——因此新创建的模型根本不会加载... Backbone 收集它们,验证失败,并触发错误。

所以,我的问题是:是否有一种“Backbone-y”方式仅在 set->save 上验证模型,而不是在 fetch->set 上验证模型?我可以使用特定的触发器来解决这个问题吗?

任何想法将不胜感激。

【问题讨论】:

    标签: backbone.js


    【解决方案1】:

    如果你传入{ silent: true }Backbone.Model.set 将不会执行验证,而fetch 将传递任何选项来设置,因此你可以覆盖fetch 或编写自己的fetchSilent 方法来传递它在选项对象中。

    但是,您可能会遇到Backbone.Collection.fetch 的小问题,因为当它从服务器接收属性时,它不会使用set 创建新模型。相反,它使用model = new this.model(attrs, {collection: this}); 创建一个新模型,然后在对象上有validate 方法时执行验证。

    这有点烦人。你可以通过在你的集合上定义一个 parse 方法来绕过它(如果你正在使用一个),它会默默地创建一个模型(使用 {silent: true}),因为当Backbone.Collection.add 接收到一个完全形成的主干模型时,它不会t 运行验证。 (参见annotated source 中的_add_prepareModel 方法)。

    集合以这种方式工作有点烦人,但(至少现在)它就是这样。

    【讨论】:

    • 确实很烦人,但感谢您的提示 -- 非常感谢。
    • 据我所见,在最新的源代码主干中,即使在通过静默时设置也会验证,所以这无济于事
    【解决方案2】:

    您可以做另一件事,而不是覆盖 fetch:

    当您验证您的模型时,检查 model.silent 并仅在它不存在时进行验证。

    因此,当您想要获取模型时,请执行以下操作:

    var test = new MyModel({ id: '123', silent: true }); 
    
    // in your Model validate function
    validate: function(attrs) {
      if (!attrs.silent) {
        // validate logic here
      }
    }
    

    然后您可以获取模型。获得模型后,您可以取消设置静音,以供将来验证。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-18
      • 1970-01-01
      • 2011-03-23
      • 1970-01-01
      相关资源
      最近更新 更多