2012-06-20 5 views
6

Я вижу, что есть методы, позволяющие иметь глубокие модели в Backbone, но как насчет иерархических коллекций одной модели?Как представить иерархию глубоких моделей в Backbone.js

Очевидным примером является дерево категорий. Таким образом, мы можем иметь модель категории, которая имеет несколько свойств: «имя», «тип», «цвет», что угодно.

Вместо того, чтобы иметь родительские идентификаторы relational db, мы используем js, поэтому хотим, чтобы данные были представлены как json.

Можно ли использовать базовую основу для поддержки (предположительно путем увеличения коллекций) структур данных, содержащих экземпляры одной модели в дереве (например, модели и подмодули - это все экземпляры одной и той же модели)?

ответ

8

Посмотрите на Backbone-Relational или supermodel.js.

Эти проекты обеспечивают лучшие формы вложенности модели, чем реализация по умолчанию.

Мы только модели Магистральные гнезда, как:

var MyModel = Backbone.Model.extend({}); 
var MySubModel = Backbone.Model.extend({}); 

var model = new MyModel({submodel: new MySubModel({color: 'blue'})}); 

И мы отменяем toJSON метод:

// nested models! Might just override the internal representation of this... 
_.extend(Backbone.Model.prototype, { 
    // Version of toJSON that traverses nested models 
    toJSON: function() { 
    var obj = _.clone(this.attributes); 
    _.each(_.keys(obj), function(key) { 
     if(!_.isUndefined(obj[key]) && !_.isNull(obj[key]) && _.isFunction(obj[key].toJSON)) { 
     obj[key] = obj[key].toJSON(); 
     } 
    }); 
    return obj; 
    } 
}); 

_.extend(Backbone.Collection.prototype, { 
    // Version of toJSON that traverses nested models 
    toJSON: function() { 
    return this.map(function(model){ return model.toJSON(); }); 
    } 
}); 

Так JSON представление выглядеть правильно, когда мы гнездовые модели. Вы должны обратить внимание на метод parse на вашей модели, хотя - когда вы вернете свой JSON с сервера, вам придется создавать все подмодели и коллекции там, чтобы все работало правильно.

+0

И да, этот первый метод 'toJSON' может быть лучше написан для выполнения' if (key instanceof Backbone.Model) 'или что-то в этом роде ... – tkone

+2

Спасибо .. и если мы извлекаем все дерево как json с сервера в одном запросе .. как мы собираемся создать экземпляр всего этого за один раз? – hacklikecrack

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