Магистральная реляционная ленивая загрузка - PullRequest
1 голос
/ 11 сентября 2011

Я использую Backbone с моим RESTful JSON API для создания приложения, которое работает с постами и их комментариями. Я пытался заставить Backbone Relational работать, но столкнулся с проблемами с моей отложенной загрузкой.

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

У меня есть 2 Backbone.RelationModels, сообщения и комментарии. Отношение поста к комментарию устанавливается следующим образом: `

relations: [{
            type: Backbone.HasMany,
            key: 'comments',
            relatedModel: 'Comment',
            includeInJSON: true, // don't include it in the exporting json
            collectionType: 'Comments'
        }]

Теперь проблема, с которой я сталкиваюсь, состоит в том, что отношения инициализируются, как только я получаю свой список, который еще не содержит комментариев. Я загружаю полные данные позже, выбирая модель по ее URI. Однако отношения, похоже, не инициализируются повторно, вызывая Posts.get (1) .get ('comments') возвращает пустую коллекцию Comments!

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

Редактировать: я могу сделать так, чтобы модель Post связывала ее изменения: комментарии к себе, что обновляет коллекцию. Однако я не могу найти надежный способ получить исходные комментарии «JSON», поскольку this.get («comments») возвращает коллекцию комментариев.

Примечание. В моей коллекции я анализирую JSON, чтобы он работал с моим API, с помощью следующего кода:

parse: function(response) {
        var response_array = [];
        _.each(response, function(item) {
            response_array.push(item);
        });

        return response_array;
    }

Это потому, что JSON, возвращаемый моим API, возвращает объект с индексированными ключами (ассоциативный массив) вместо собственного JSON-массива.

{
    "id" : "1",
    "title" : "post title",
    "comments" : {
        "2" : {
            "id" : "2",
            "description": "this should solve it"
        },
        "6" : {
            "id" : "6",
            "description": "this should solve it"
        }
    }
}

Спасибо большое! Пожалуйста, задавайте любые вопросы, я уверен, что где-то был расплывчатым!

Ответы [ 2 ]

3 голосов
/ 12 сентября 2011

Модель Backbone Relational не анализирует коллекции, кроме массивов, JSON из моего вопроса не работал. Я изменил бэкэнд, чтобы возвращать комментарии в правильном массиве

{
    "id" : "1",
    "title" : "post title",
    "comments" : [
        {
            "id" : "2",
            "description": "this should solve it"
        },
        {
            "id" : "6",
            "description": "this should solve it"
        }]
    }
}

RelationalModel не поддерживает функцию синтаксического анализа, предоставляемую Backbone для анализа вашего JSON, прежде чем он перейдет дальше. Когда сервер возвращает «правильный» JSON, отложенная загрузка работает без дополнительного кода.

1 голос
/ 30 апреля 2012

Вы также можете использовать метод инициализации в вашей модели комментариев, чтобы смоделировать метод анализа и определить атрибуты с пользовательскими значениями, такими как (CoffeeScript):

initialize: (obj) ->
  @attributes = obj.customKey 
...