Javascript 我的主干模型的验证方法在Model.fetch上调用,但在collection.fetch上没有调用
编辑tl;dr:我只想获取模型,并将它们添加到符合某些验证标准的集合中。如果仅获取单个模型,我可以使用model.validate方法,但在使用collection.fetch时,不会调用model.validate 我正在使用github gist API制作一个gist fallery,一个la bl.ocks.org。我只想显示具有标记文件的Gist,因此我在Gist模型上有一个验证方法:Javascript 我的主干模型的验证方法在Model.fetch上调用,但在collection.fetch上没有调用,javascript,backbone.js,coffeescript,backbone.js-collections,backbone-model,Javascript,Backbone.js,Coffeescript,Backbone.js Collections,Backbone Model,编辑tl;dr:我只想获取模型,并将它们添加到符合某些验证标准的集合中。如果仅获取单个模型,我可以使用model.validate方法,但在使用collection.fetch时,不会调用model.validate 我正在使用github gist API制作一个gist fallery,一个la bl.ocks.org。我只想显示具有标记文件的Gist,因此我在Gist模型上有一个验证方法: class Gist extends Backbone.Model validate: (at
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
我现在的行为是,当我显示GIST列表时,我会得到没有标签文件的GIST的缩略图,请参见下面的屏幕截图。但是,当我单击带有无效gist的缩略图时,它不会显示,因为validate方法返回了validationError。当单击缩略图以在呈现github之前从github获取其他信息时,会调用gist模型的蚀刻方法
如果模型没有标记文件,我如何使用模型的验证方法来确保模型没有通过collection.fetch添加到集合中?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)
主干网有一个名为parse的函数,在主干网将内容从服务器绑定到模型之前从服务器返回任何数据时调用该函数。 你可以重写这个函数,类似这样
Model = Backbone.Model.extend({
parse: function () {
return {
id: this.get("id"),
AnotherThing: this.get("AnotherThing")
}
}
});
在这里读一读
希望能有所帮助。在集合中使用解析器解析函数过滤掉不需要的模型。谢谢,效果很好。我现在意识到主干提取缓存正在发生一些更阴险的事情。在第一页加载时,模型已正确验证,只有在后续刷新时才会显示无效模型。但是使用collection.parse解决了这个问题。