2014-01-24 3 views
1

В моем приложении у меня есть два типа данных: группы, содержащие элементы и сами элементы. Каждому элементу присваивается группа, и пустые группы могут существовать (и должны быть представлены). Это похоже на простой сценарий, но у меня возникли проблемы с поиском информации о том, как настроить модели, представления и ответы JSON в этом случае.Backbone.js: один вложенный ответ JSON или несколько ответов JSON?

Было бы разумно иметь как коллекцию групп, так и коллекцию предметов и включать в себя отдельный URL-адрес JSON для каждого из них? Ответы JSON будет выглядеть, например:

[ { "id": 1, 
    "name": "Group A" 
    }, 
    { "id": 2, 
    "name": "Group B" 
    }, 
    { "id": 3, 
    "name": "Group C" 
    } ] 

и

[ { "id": 1, 
    "group_id": 1, 
    "name": "Item A" 
    }, 
    { "id": 2, 
    "group_id": 1, 
    "name": "Item B" 
    }, 
    { "id": 3, 
    "group_id": 2, 
    "name": "Item C" 
    } ] 

В этом случае, как вы справляетесь с асинхронной загрузки двух объектов JSON, которые связаны между собой?

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

EDIT: в представлении отобразятся несколько групп, причем каждая группа содержит ноль или более элементов.

ответ

1

вот модель я уже использовал в своих прошлых проектах

в вашей ситуации, я хотел бы сообщить о возвращении одного сервера groups JSON с элементами вложенными внутри, например:

[ 
    { 
    'id': 1, 
    'name': 'Group A', 
    'items': [ 
     { 
     'id': 1, 
     'name': 'item A' 
     }, 
     { 
     'id': 2, 
     'name': 'item B' 
     } 
    ] 
    }, 
    { 
    'id': 2, 
    'name': 'Group B', 
    'items': [ 
     { 
     'id': 4, 
     'name': 'item D' 
     } 
    ] 
    }, 
    { 
    'id': 3, 
    'name': 'Group C', 
    'items': [] //emtpy 
    } 
] 

и в Ваша модель Магистральная, вы можете разобрать каждый отдельный вложенные элементы массива к items коллекции:

var Group = Backbone.Model.extend({ 
    parse: function (data) { 
    data.items = new Items(data.items); 
    return data; 
    } 
}); 

поэтому при инициализации седловины разночтение, не забудьте передать {синтаксического анализа: истинно} для опций:

var groups = new Groups([...], {parse: true}); 

или вы можете переопределить конструктор в модели, чтобы заставить парсер быть всегда верно:

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

    parse: function() { ... } 
}); 

Я обычно создаю отдельный модель с принудительным анализом и создавать модели, расширяя это, чтобы избежать использования этого везде.

когда, то в этой коллекции, для каждого group вы будете иметь вложенную коллекцию Items,

group.get('items'); //is a backbone collection 

вы можете передать его подвидов, чтобы сделать каждый отдельный элемент.

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

образец jsfiddle здесь: http://jsfiddle.net/4LNXz/

1

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

если у вас есть возможность пойти с примером 2, вы, вероятно, должны сделать это ...

1

Это действительно зависит от того, как вы планируете использовать модель данных в ваших взглядах.

  1. Планируете ли вы показать одну группу за просмотр? Если да, то может быть достаточно иметь набор предметов. Если ни один набор групп, содержащий коллекцию предметов, не подходит лучше.

  2. Вы также разрабатываете бэкэнд? Если да, то, очевидно, имеет смысл структурировать его так же, как и ваша модель данных. Это будет означать сервис для запроса всех групп и службы для запроса всех элементов внутри группы. Если нет, вам нужно будет добавить логику для заполнения вашей модели данных из JSON, что является менее идеальным вариантом.

Или вы показываете данные в сетке? В этом случае может быть совершенно нормально иметь все предметы в плоском JSON.

+0

Спасибо, Уилл. Да, я планирую отображать несколько групп на просмотр с несколькими элементами на группу. Итак, в отношении вашего первого пункта вы предлагаете коллекцию Items, связанную с каждой группой (как [описано здесь] (http://backbonejs.org/#FAQ-nested))? В ответ на ваш второй вопрос, похоже, что у вас есть несколько групп, и несколько коллекций предметов на группу приведут к множеству запросов JSON. Зная, что существует несколько групп для просмотра, влияет ли это на вашу рекомендацию? Или это еще предпочтительнее альтернативы добавления логики для разбора JSON? –

+0

Представление данных будет несколько сетчатым. Фактически, каждая группа будет действовать как bin (вероятно, только стилизованный div), содержащий произвольное количество элементов. –

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