Модели в Backbone.js

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

Events
  User
  Participants(users)
  Payments
    User
    Users
    Event
  Comments
    User
    Event

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

"events": {
  "id": "event_1",
  "user": {
    "id": "user_1", "name":"name"
  }, "participants": [
    {"id": "user_1", "name":"name"},
    {"id": "user_2", "name":"name"}
  ], "payments": [{
      "id":"payment_1",
      "user": {
        "id": "user_1", "name":"name"
      },"users": [
        {"id": "user_1", "name":"name"},
        {"id": "user_2", "name":"name"}
      ], "event": {root event object}  
    }], "comments": [{
      "id": "comment_1",
      "user": {
        "id": "user_1", "name":"name"
      }, "event": {root event object}  
    }]
  }
}

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

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

Ответ 1

Архитектура субъективна, но вот как бы я это сделал -

3 базовые модели

User = Backbone.Model.extend({
    defaults : {
        name : ""
    }
})
Payment = Backbone.Model.extend({
    defaults : {
        user : new User(),
        users : new UserList(),
        event : ""
    }
})
Comment = Backbone.Model.extend({
    defaults : {
        user : new User(),
        event : ""
    }
})

3 Коллекции

UserList = Backbone.Collection.extend({
    model : User
})
PaymentList = Backbone.Collection.extend({
    model : Payment
})
CommentList = Backbone.Collection.extend({
    model : Comment
})

Одна модель события

Event = Backbone.Model.extend({
    defaults : {
        user : new User(),
        participants : new UserList(),
        payments : new PaymentList(),
        comments : new CommentList()
    }
})

Если вы инициализировали объект события с помощью JSON в приведенном выше примере, он должен просто работать. В будущем, если вы хотите отделить своих пользователей от другого API, этот код также должен его поддерживать. Если вы хотите, чтобы объекты компонентов были доступны глобально позже, вы можете просто получить их из пользовательского объекта, то есть window.User = myEvent.get( "пользователь" )

Надеюсь, что это поможет:)

Ответ 2

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

Другими словами, событие - это только объект события. Он ссылается на другие объекты по id. Каждый из этих объектов имеет свои собственные классы моделей и соответствующие URL-адреса API. Поэтому вам тогда понадобится получить объект пользователя из API, если и когда это необходимо (по id).