Магистрально-реляционный анализ вложенных моделей

Я думал, что backbone-relational автоматически анализирует и подготавливает вложенные модели для вложенного json. У меня такой большой json

{  //ItemResultModel
   "items":[  
      {  //ItemModel
         "id":120514,
         "recordDate":"2013-10-19T00:00:00",
         "owner":{  
            "id":"d14a052b-a9df-45ba-92e5-58adfe28c10c",
            "firstName":null,
            "lastName":null
         },
         "features":[  
            {  //FeatureModel
               "id":1,
               "properties":[  
                  {  //PropertyModel
                     "id":814518,
                     "values":[  
                        "5"
                     ]
                  }
                  //,other properties
               ]
            }
           //, other features
         ]
      }
   ],

   //other models and collections
   "facets":{  

   },
   "totalCount":7
}

И я попытался разобрать этот json на свои модели, используя реляционную магистраль. А вот и мои модели:

app.Models.ItemResultModel = Backbone.RelationalModel.extend({
    relations: [{
        type: Backbone.HasMany,
        key: 'items',
        relatedModel: 'app.Models.ItemModel',
        collectionType: 'app.Collections.ItemCollection',
        parse: true   
    }]
});

  app.Collections.ItemCollection = Backbone.Collection.extend({
        model: app.Models.ItemModel
    });

app.Models.ItemModel = Backbone.RelationalModel.extend({
    urlRoot: '/api/Item',
    relations: [{
        type: Backbone.HasMany,
        key: 'features',
        relatedModel: 'app.Models.FeatureModel',
        collectionType: 'app.Collections.FeatureCollection',
        parse: true    
    }]       
});
app.Models.FeatureModel = Backbone.RelationalModel.extend({
    relations: [{
        type: Backbone.HasMany,
        key: 'properties',
        relatedModel: 'app.Models.ItemPropertyModel',
        collectionType: 'app.Collections.ItemPropertyCollection'
    }]
});

app.Collections.FeatureCollection = Backbone.Collection.extend({
    model:app.Models.FeatureModel
});

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

this.model.get('items'); // this has some item models as i expect
this.model.get('items').at(0).get('features');//items does not have any feature model

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


person omeralper    schedule 26.10.2014    source источник


Ответы (2)


если использовать простую магистральную модель?

this.model.get('items')[0].features

или если вы создаете коллекцию на основе массива элементов:

this.collection.at(0).get('features')
person aleha    schedule 26.10.2014
comment
Таким образом вы можете брать только чистые данные json. Не магистральная модель. Без реляционной магистрали я уже могу получить массив функций, но мне нужна модель магистрали. - person omeralper; 27.10.2014
comment
this.collection.at (0) - предоставить вам модель по указанному индексу из коллекции - person aleha; 27.10.2014

Теперь я понял, что есть аналогичный вопрос. Извини за это. Для этого не нужно использовать backbone-relational.

 app.Models.ItemResultModel = Backbone.Model.extend({
        subCollections: {
            items: app.Collections.ItemCollection
        },
        parse: function (response) {
            //Solution
            this.set({
                itemsCollection: new app.Collections.ItemCollection(response.items, { parse: true })
            });
            delete response.items;

            //Better solution
            for (var key in this.subCollections) {
                var embeddedClass = this.subCollections[key];
                var embeddedData = response[key];
                response[key] = new embeddedClass(embeddedData, { parse: true });
            }

            return response;
        }
    })

И вы можете сделать то же самое для всех уровней иерархии.

person omeralper    schedule 26.10.2014