2013-11-22 5 views
0

Я использую магистраль 1.1 и пытаюсь создать коллекцию с древовидной навигации глубиной 3-5 уровней.Создание дерева базы опорных линий

Упрощенная версия моего кода выглядит так.

var treeItem = Backbone.Model.extend({ 
    defaults : { 
     'label'  : '', 
     'children' : null 
    }, 
    initialize : function() { 
     console.log('model init'); 
     if (_.isArray(this.get('children'))) { 
      this.set({children : new treeItemCollection(this.get('children'))}); 
     } 
    }, 
}); 

var treeItemCollection = Backbone.Collection.extend({ 
    model: treeItem 
}); 

var myTree = new treeItemCollection([ 
    { "label" : "first", "id": 1 }, 
    { "label" : "second", "id": 1, "children": 
     [ 
      { "label" : "second.first", "id" : 21 }, 
      { "label" : "second.second", "id" : 22 }, 
      { "label" : "second.third", "id" : 22, "children" : [ 
       { "label" : "third.first", "id" : 31 }, 
       { "label" : "third.second", "id" : 32 } 
      ] } 
     ] 
    } 
]); 

В моем понимании это должно правильно создавать дочерние-коллекции более глубокий уровень (как в моем понимании, инициализация должна вызываться, когда объект строится с тем самым создавая более глубокие уровни правильно).

По какой-то причине это, похоже, не так. Второй уровень (например. myTree.models[0].get('children') правильно коллекция типа treeCollection, но третий уровень (myTree.models[0].get('children').models[0].get('children')) просто прямо вверх JSON из объекта параметров.

Для меня это самая странная часть, что второй уровень в порядке , но третий нет. Консоль.log в initialize() должна проверить, и совершенно верно, она запускается 4 раза, а не 6.

Я пытаюсь понять, почему 3-й уровень не преобразуется в коллекция

+0

Кстати, ваш пример работает для меня по какой-то причине. за исключением того, что у вас есть дублированные идентификаторы в json. Интересно, вызывает ли это проблемы. –

ответ

0

Для этого вы можете перезаписать функцию разбора в модели.

var treeItem = Backbone.Model.extend({ 
    defaults : { 
    'label'  : '', 
    'children' : null 
    }, 
    initialize : function() { 
    console.log('model init'); 
    }, 

    parse: function(response) { 
    if (response["children"]) { 
     response["children"] = new treeItemCollection(response["children"]); 
    } 
    return response; 
    } 
}); 

Таким образом, каждый раз, когда вы выполняете выборку() или save(), он автоматически обертывает ваши дети (и их вложенные дети, если они существуют) в treeItemCollection.

Но это не работает, когда вы загружаете свои данные или используете только функцию reset(). поэтому вы можете также перезаписать метод конструктора:

var treeItem = Backbone.Model.extend({ 
    //other stuff shown above 

    constructor: function(attributes, options){ 
    options = options || {}; 
    options.parse = true; 
    Backbone.Model.call(this, attributes, options); 
    } 
}); 

и он должен работать на ваш случай.

Мы использовали этот образец во многих проектах, и нам это очень понравилось. Если вы хотите применить его ко всем моделям/коллекциям и быть более гибкими, вы, вероятно, захотите прочитать это: http://www.devmynd.com/blog/2013-6-backbone-js-with-a-spine-part-2-models-and-collections

+0

Спасибо, это оказалось полезным. Я закончил тем, что использовал по существу тот же шаблон. – Marcus

Смежные вопросы