Магистраль: создание моделей из коллекции моделей, содержащей коллекцию моделей.

У меня есть API, который создает данные GeoJSON о ряде мест и событий, происходящих на каждом месте.

См. пример вывода:

{
   "crs":null,
   "type":"FeatureCollection",
   "features":[
      {
         "geometry":{
            "type":"Point",
            "coordinates":[
               -122.330056,
               47.603828
            ]
         },
         "type":"Feature",
         "id":39,
         "properties":{
            "city_slug":"seattle",
            "neighborhood_name":"Downtown",
            "events__all":[
               {
                  "category__category":"Gallery",
                  "eventid":16200847,
                  "description":"A Wider View, curated by Onyx Fine Arts Collective, features 60 works by 23 artists of African descent.",
                  "title":"A Wider View",
                  "cost":"Free",
                  "category__slug":"gallery",
                  "slug":"a-wider-view"
               }
            ],
            "venue_name":"City Hall Lobby Gallery",
            "venue_address":"600 4th Avenue, Seattle, WA 98104, USA",
            "city_name":"Seattle",
            "neighborhood_slug":"downtown",
            "venue_slug":"city-hall-lobby-gallery"
         }
      },
      {
         "geometry":{
            "type":"Point",
            "coordinates":[
               -122.348512,
               47.6217233
            ]
         },
         "type":"Feature",
         "id":42,
         "properties":{
            "city_slug":"seattle",
            "neighborhood_name":"Downtown",
            "events__all":[
               {
                  "category__category":"Museums",
                  "eventid":15455000,
                  "description":"The Art of Video Games tackles a 40-year history, with a focus on video game as art form. Nerdy heartstrings will be tugged in this nostalgia-inducing retrospective, including everything from the Atari VCS to Playstation 3.",
                  "title":"The Art of Video Games",
                  "cost":"$20",
                  "category__slug":"museums",
                  "slug":"the-art-of-video-games"
               },
               {
                  "category__category":"Museums",
                  "eventid":15213972,
                  "description":"There's just something about the black leather jacket. It's a garment that invariably comes with context, that cannot help but be an icon. Worn to Be Wild: The Black Leather Jacket explores the evolution of the leather jacket from \"protective gear to revolutionary garb.\"",
                  "title":"Worn to Be Wild: The Black Leather Jacket",
                  "cost":"$20",
                  "category__slug":"museums",
                  "slug":"worn-to-be-wild-the-black-leather-jacket"
               }
            ],
            "venue_name":"Experience Music Project | Science Fiction Museum.",
            "venue_address":"325 5th Avenue North, Seattle, WA 98109, USA",
            "city_name":"Seattle",
            "neighborhood_slug":"downtown",
            "venue_slug":"experience-music-project-science-fiction-museum"
         }
      }
   ],
   "bbox":[
      -122.348512,
      47.6035448,
      -122.3233742,
      47.6217233
   ]
}

Я хочу сопоставить это с коллекцией под названием VenueEvents. VenueEvents содержит модели с именем JsonVenues, и каждая из этих площадок затем содержит коллекцию с именем EventSet, содержащую несколько моделей Event (дополнительная тема: является ли название модели «Событие» рецептом катастрофы?).

Мои модели обозначены так:

var Event = Backbone.Model.extend({
  parse: function(response){
    return {
      id: response.eventid,
      slug: response.slug,
      title: repsonse.title,
      description: response.description,
      category: response.category__category,
      cost: response.cost
    }
  }
});

var EventSet = Backbone.Collection.extend({
  model: Event,
  }
});

var JsonVenue = Backbone.Model.extend({
  initialize: function(attributes) {
    console.log(attributes)
  },
  parse: function(response){
    // var eventSet = new EventSet(response.properties.events__all);
    return {
      name: response.properties.venue_name,
      address: response.properties.venue_address,
      neighborhood: response.properties.neighborhood_name,
      //eventSet: eventSet
    }
  }
});

// Is this actually a model?
var VenueEvents = Backbone.Collection.extend({
  model: JsonVenue,
  url: '/json/',
  parse: function(response){
    return response.features;
  }
});

Объекты VenueEvents и JsonVenue создаются, как и ожидалось, за исключением того, что объект response.properties.events__all, похоже, не попадает в модель JsonVenue (где я ожидаю использовать его для создания коллекции EventSet). Я поставил console.log(attributes) в параметр initialize объекта JsonVenue, и это показывает, что, хотя все остальные значения в пределах features.properties объекта JsonVenue попадают в модель, events__all нет.

Есть ли какая-то причина, почему это происходит? Возможен ли этот метод загрузки вложенных данных JSON в модели? В большинстве примеров люди включают только id вложенного объекта в свои выходные данные JSON, а затем (я предполагаю) строят модель из этого объекта в другой строке JSON и связывают их на основе идентификатора. Похоже, это потребует больше трафика между сервером и клиентом. Я также вижу, как люди загружают данные из других источников. Является ли это рекомендуемым методом связывания моделей в одном вызове API?

Спасибо!


person alukach    schedule 06.04.2013    source источник
comment
Вы на самом деле используете Backbone-relational (в качестве плагина Backbone)? Вы кладете его в теги. Это может быть интересно для вас, если вы загружаете все сразу. Что касается вашей проблемы, если вам никто не ответит, я разберусь с ней, когда у меня будет время.   -  person Loamhoof    schedule 06.04.2013


Ответы (1)


Ну .. Я только что попробовал ваш код, используя:

new VenueEvents(json, {parse: true});

для создания своей коллекции. И... похоже, работает просто отлично...

Тем не менее, Backbone-relational может иметь поведение, которое вы хотите упростить для своего кода (это всего лишь предположение , я никогда не проверял это сам и не видел его по-настоящему).

person Loamhoof    schedule 06.04.2013
comment
Вы совершенно правы. Судя по всему, он работает так, как ожидалось. Это заставило меня понять, что поток JSON, который я получал, на самом деле не содержал в себе EventSet (необходимо передать параметр с запросом на получение). Спасибо за помощь в устранении неполадок! - person alukach; 07.04.2013