我有几条路径,它可以是无限的深度和路径数量。
我使用骨干,并从服务器获取数据,每个模型包含一个路径字段,例如:
"/home/harry/"
"/home/sally/"
"/home/sally/personal"
"/home/harry/files"
"/home/harry/photos"
"/home/harry/videos"
"/home/harry/files/documents"
"/home/harry/files/personal"
"/home/harry/photos/2012"
"/home/harry/photos/2011"
"/home/harry//videos/2012"
"/home/harry/videos/edited"
"/home/harry/videos/edited/other/trash_this"
我想对模型进行分组,以便我可以在我的Web应用程序中表示文件结构,以便您可以单击“home”并列出其所有相关目录,依此类推。因此,您可以进一步单击该结构,直到该文件夹/目录中没有其他文件或目录。
答案 0 :(得分:0)
一种解决方案就是将这些路径解析为一组集合。类似的东西:
var home = new PathCollection({});
_(models).each(function(model) {
if (model.get('path').indexOf('/home/') == 0) {
model.set('relativePath', model.get('path').substr(6)) ; ditch '/home/'
home.add(model);
}
}
然后,在PathCollection中你可以覆盖add方法来做类似的事情(即查看模型的相对路径的第一部分并将它们添加到相应的Collection中),如下所示:
var PathCollection = Backbone.Collection.extend({
add: function(model) {
// NOTE: This is naive; a real add would need to accept multiple models
if (model.get('relativePath').indexOf('harry/') == 0) {
// create harry collection if it doesn't exist
if (!this.harry) this.harry = new PathCollection();
this.harry.add(model);
}
}
})
当然,您可能希望将其设置为更通用,并拆分“/”字符,而不是对特定路径执行特定的indexOf
检查,但希望您能够理解。关键是,如果你编写一个集合来检查其成员模型的路径,并在适当的时候将它们添加到其他集合中,那么在一天结束时你将得到一个很好的嵌套系列集合。
一旦你有了这个,检查哪些模型属于哪些路径变得微不足道;例如,你可以在/ home / harry / path下获取模型:
home.harry.models;