编辑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获取其他信息时调用}方法
我如何使用模型的fetch
方法确保模型未通过validate
添加到集合中,如果它没有标记文件?
答案 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
希望它有所帮助。