Реляционная ленивая загрузка магистрали

Я использую 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') возвращает пустую коллекцию комментариев!

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

Изменить: я могу заставить модель 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"
        }
    }
}

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


person JaapRood    schedule 11.09.2011    source источник


Ответы (2)


Реляционная модель Backbone не анализирует коллекции, кроме массивов, 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, отложенная загрузка работает без дополнительного кода.

person JaapRood    schedule 12.09.2011

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

initialize: (obj) ->
  @attributes = obj.customKey 
person AdkJ    schedule 30.04.2012