Backbone collections representing tree data

前端 未结 2 377
悲哀的现实
悲哀的现实 2021-02-05 07:15

I want to load json data in form of a tree into Backbone Collection. I can\'t do this. Can anyone explain what I\'m doing wrong?

My very simple model:

CT         


        
2条回答
  •  忘了有多久
    2021-02-05 07:57

    Try representing the tree with Model as the node and each node containing a Collection of its child nodes:

    var CTreeDataItem = Backbone.Model.extend({
        initialize: function() {
            if (Array.isArray(this.get('items'))) {
                this.set({items: new CTreeDataItemChildren(this.get('items'))});
            }
        }
    });
    
    // children collection
    var CTreeDataItemChildren = Backbone.Collection.extend({
        model: CTreeDataItem
    });
    
    // create
    var treeData = new CTreeDataItemChildren(treeJs);
    
    // access
    treeData.at(0).get('items').at(1).get('title')
    // returns "Item2"
    

    EDIT 2011-05-18: If you want to flatten the tree and maintain a reference to the parent that each node had in the tree:

    // flatten the tree outside of Backbone. Alternatively,
    // you could override the constructor of the CTree collection
    // to provide encapsulation
    function flatten(parentID, arr) {
        var out = [];
        for (var i = 0; i < arr.length; i++) {
            var node = arr[i];
            node.parentID = parentID;
            out.push(node);
            if (Array.isArray(node.items))
                Array.prototype.push.apply(out, flatten(node.id, node.items));
            delete node.items;
        }
        return out;
    }
    
    // remove above code that would have provided nesting
    var CTreeDataItem = Backbone.Model.extend({});
    
    // children collection, as before 
    var CTreeDataItemCollection = Backbone.Collection.extend({
        model: CTreeDataItem
    });
    
    // create
    var treeData = new CTreeDataItemChildren(flatten('', treeJs));
    
    // as before, but now there's the 'parentID' FK
    treeData.at(3).get('parentID')
    // returns "ti1"
    

    Hope that's what you're after.

提交回复
热议问题