0

我有几条路径,路径的深度和数量可能是无限的。

我使用主干,并从服务器获取数据,每个模型都包含一个路径字段,例如:

"/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"

我想对模型进行分组,以便我可以在我的网络应用程序中表示文件结构,以便您可以单击“主页”并列出其所有相关目录等。因此,您可以进一步单击结构,直到该文件夹​​/目录中不再有文件或目录。

4

1 回答 1

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 方法以执行类似的操作(即查看模型的相对路径的第一部分并将它们添加到适当的集合中),如下所示:

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/ 路径下的模型,您只需执行以下操作:

home.harry.models;
于 2013-01-23T21:18:24.413 回答