【问题标题】:My Backbone Model's validate method called on model.fetch, but not on collection.fetch我的主干模型的验证方法在 model.fetch 上调用,但在 collection.fetch 上没有
【发布时间】:2014-09-08 18:02:40
【问题描述】:

编辑 tl;dr: 我只想获取模型并将它们添加到满足某些验证标准的集合中。如果我只获取一个模型,我可以使用model.validate() 方法,但是在使用collection.fetch() 时,不会调用model.validate()

我正在使用 github gist API 制作一个 gist fallery,一个 la bl.ocks.org。我只想显示具有“标签”文件的要点,所以我的要点模型上有一个验证方法:

class Gist extends Backbone.Model

  validate: (attrs, options)->
    if attrs.files.hasOwnProperty("tags") is false
      return "no tags file"

  sync: (method, model, options) ->
    options.timeout = 8000
    options.dataType = 'jsonp'
    options.validate = true
    return Backbone.sync(method, model, options)

  defaults: ......
  parse: (data)-> ......

当我从 github 获取一个要点时,这可以正常工作。但是,当我获取一系列要点时,不会触发此验证方法。

class Gists extends Backbone.Collection

  model: Gist

  sync: (method, model,options) ->
    options || options = {}
    options.timeout = 8000
    options.dataType = 'jsonp'
    options.validate = true
    return Backbone.sync(method, model, options)

  parse: (response) ->
    response.data

  #more methods here, including initialize, comparator, and custom ones

我现在的行为是,当我显示要点列表时,我会得到没有“标签”文件的要点的缩略图(见下面的屏幕截图)。但是,当我单击具有无效 gist 的缩略图时,它不会显示,因为 validate 方法返回了 validationError(单击缩略图时会调用 gist 模型的fetch 方法以获取附加信息渲染前来自 github 的信息)

如果模型没有标签文件,我如何使用模型的validate 方法确保模型不会通过collection.fetch 添加到集合中?

【问题讨论】:

  • 在收集时使用解析器(解析函数)过滤掉不需要的模型。
  • 谢谢,效果很好。我现在意识到backbone-fetch-cache. 正在发生更阴险的事情。在第一页加载时,模型已正确验证,只有在随后的刷新时才显示无效模型。但是使用 collection.parse 解决了这个问题。

标签: javascript backbone.js coffeescript backbone.js-collections backbone-model


【解决方案1】:

Ravi Hamsa 的建议非常有效。以下是我的实现方式:

class Gists extends Backbone.Collection

  model: GistModel

  sync: (method, model,options) ->
    options || options = {}
    options.timeout = 8000
    options.dataType = 'jsonp'
    return Backbone.sync(method, model, options)

  parse: (response) ->
    (gist for gist in response.data when gist.files.hasOwnProperty("tags") is true)

【讨论】:

    【解决方案2】:

    Backbone 有一个叫做 parse 的函数,当backbone 将内容从服务器绑定到模型之前从服务器返回任何数据时调用该函数。 你可以重写这个函数,就像这样。

    Model = Backbone.Model.extend({
        parse: function () {
            return {
                id: this.get("id"),
                AnotherThing: this.get("AnotherThing")
            }
        }
    });
    

    在这里阅读。

    http://backbonejs.org/#Model-parse

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-23
      • 1970-01-01
      • 2013-08-10
      相关资源
      最近更新 更多