2

我是 Backbone 的新手。我有一个任意深度的嵌套列表,其中列表中的每个节点都可能有一个子集合。例如:

item 1
  item a
    item i
    item ii
  item b
  item c
item 2
item 3
etc

我想知道使用 Backbone 表示此数据结构的最简单方法是什么。

如果重要的话,我在最初加载整个结构或根据需要加载每个级别之间没有偏好。无论是最简单的。

我宁愿不走 Backbone-Relational 的路线,因为我觉得这样的事情有点矫枉过正。

在此先感谢您的帮助。

4

2 回答 2

0

我会制作一个简单的模型,可能会将默认属性children设置为new Collection(如果需要)。主要部分是从 JSON 数据加载到模型。

var MyModel = Backbone.Model.extend({

});
var MyCollection = Backbone.Collection.extend({
    model: MyModel,
    load: function(data) {
        for(var i in data) {
            if (_.isString(data[i])) {
                this.add(new MyModel({
                    title: data[i]
                }));
            } else {
                var collection = new MyCollection();
                collection.load(data[i]);
                this.add(new MyModel({
                    title: i,
                    children: collection
                }));
            }
        }
    }
});

var collection = new MyCollection();
collection.load({
    'item1': {
        'item a': ['item i', 'item ii'],
        0: 'item b',
        1: 'item c'
    },
    0: 'item2',
    1: 'item3'
});
console.log(collection);

只有在这个示例中带有“0”和“1”键的项目才会进入集合的开头,但你可以看到这个想法。

于 2013-01-06T23:54:46.690 回答
0

假设您的数据结构看起来像这样

[
  {
    title: "item 1",
    nodes: [
      {title: "item a",
        nodes: [
          {title: "item i"},
          {title: "item ii"}
        ]
      },
      {title: "item b"
      }
    ]
  },
  {
    title: "item 2"
  }
]

您可以通过覆盖模型的 parse 方法来设置层次结构:

var Node = Backbone.Model.extend({
  parse: function(data) {
    this.nodes = new Nodes(data.nodes, {parse: true});
    return _.omit(data, 'nodes');
  }
});

var Nodes = Backbone.Collection.extend({
  model: Node
});

var c = new Nodes(data_structure, {parse: true}); 
// parse: true is only needed if you pass the data as an argument

Node.parse从数据哈希中提取nodes属性以在对象上构建自定义属性,然后返回其余属性以让 Backbone 处理其他属性。然后,您可以使用 访问该集合model.nodes。还有一个可以玩的小提琴http://jsfiddle.net/C8HGY/

于 2013-01-07T15:19:50.733 回答