Просто удивляясь, каков наилучший метод для следующей ситуации, я выполнил поиск, но, похоже, получаю только результаты, ссылающиеся на наследование родителей / детей, а это не так, и я не могу придумать другого способа выразить это!
Допустим, у меня есть следующие упрощенные примеры объектов:
- Объект карты (см. Правку ниже)
- Объект цитаты, который содержит:
- Объект даты,
- Объект маршрута, который содержит:
- Массив путевых точек, каждая из которых содержит:
- Объект сайта, который содержит следующие свойства:
Теперь, если я хочу вычислить восход / закатраз на конкретном сайте мне понадобятся дата, широта и долгота.В настоящее время мой объект сайта имеет следующую (псевдокодовую) функцию:
var Site = function() {
var lat;
var lng;
var calculateSunriseSunset = function(date) {
// do calculation with lat, lng and date
return result;
}
}
и, например, я мог бы вызвать функцию следующим образом:
site.calculateSunriseSunset(quote.get('date')); // site here is a reference to a specific site object
где 'quote'является глобальной ссылкой на родительский объект Quote.Для меня это уродливо и кажется плохой практикой (циклическая ссылка «соединена»).
Тем не менее, есть только два других варианта, о которых я могу думать:Цитируйте объект и передавайте ему сайт и дату в качестве параметров (но это кажется плохой практикой, потому что восход и закат связаны с конкретным сайтом, и существует множество примеров такого разброса по разнымобъекты - я волнуюсь, делая это, объект Quote просто превращается в грязную ловушку)
передает дату объекту маршрута в качестве параметра при его создании, который, в свою очередь, проходит по каждой путевой точке, обновляя каждуюсайт с установленной датой.Это кажется грязным, особенно когда дата меняется, и весь процесс должен быть выполнен снова.
Есть ли лучший способ сделать это, что я пропускаю?
Спасибо
РЕДАКТИРОВАТЬ
1) Чтобы уточнить, что я имел в виду под «глобальной ссылкой», я просто имел в виду, что использовал следующий код:
var quote = new Quote();
где кавычка была определена в глобальном пространстве имен и может вызываться из любого места.
2) Функция «возложить на экран» вызвана из другого объекта, объекта «Карта», который имеет дело со всем, что связано скарта, которая отображается для пользователя.Это выглядит примерно так (значительно упрощено):
var Map = function() {
var sites; // list of sites loaded from the server
var leafletMap; // reference to the [Leaflet][1] map object used to do the 'heavy lifting'
var root = this;
showSites = function() {
var siteLayer = L.geoJson(sites, {
onEachFeature: function (feature, layer) {
layer.on('click', function (e) {
root.openPopup(e.target.feature);
});
},
}).addTo(leafletMap);
}
this.openPopup = function(site) {
var popup = L.popup().setContent(site.calculateSunriseSunset(quote.get('date'))).openOn(leafletMap);
}
}