我的Backbone Model的validate方法在model.fetch上调用,但不在collection.fetch上调用

时间:2014-07-17 18:18:07

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

编辑tl;博士: 我想只提取模型并将其添加到符合某些验证标准的集合中。如果我只提取单个模型,则可以使用model.validate()方法,但在使用collection.fetch()时,不会调用model.validate()

我正在使用github gist API创建一个gists fallery,一个la bl.ocks.org。我只想显示带有"标签的要点"文件,所以我在我的Gist模型上有一个验证方法:

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获取单个gist时,这可以正常工作。但是,当我提取一系列要点时,不会触发此验证方法。

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

我现在的行为是,当我显示要点列表时,我会获得没有"标记的要点的缩略图"文件(见下面的截图)。但是,当我点击带有无效要点的缩略图时,它不会显示,因为validationError方法返回了validate(要点模型' s {{1}在单击缩略图以在渲染之前从github获取其他信息时调用}方法

enter image description here

我如何使用模型的fetch方法确保模型未通过validate添加到集合中,如果它没有标记文件?

2 个答案:

答案 0 :(得分:0)

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)

答案 1 :(得分:0)

Backbone有一个名为parse的函数,在骨干将内容从服务器绑定到模型之前,从服务器返回任何数据时调用该函数。 您可以覆盖此功能,如下所示。

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

在这里阅读。

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

希望它有所帮助。