Основа: создание моделей из коллекции моделей, которые содержат коллекцию моделей
У меня есть 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?
Спасибо!
1 ответ
Хорошо.. Я только что попробовал ваш код, используя:
new VenueEvents(json, {parse: true});
создать свою коллекцию. И... это работает просто отлично, кажется...
Тем не менее, Backbone-реляционный может иметь поведение, которое вы хотите упростить в своем коде (это всего лишь предположение, я сам никогда не проверял его и не смотрел на него по-настоящему).