我正在玩Meteor,而我却无法绕过一些概念。我目前正在处理的一个问题是我正在尝试使用Google和Meteor构建动态热图。我的Meteor Mongo数据库外部(即不是Meteor提供的本地MongoDB)位于我的计算机上,在数据库中我有一个包含许多文档的集合,每个文档都有一个纬度值,经度值。
我现在遇到的问题是,当我尝试解析我的集合中的find()的结果集时,它没有填充,因此我的热图值不是被绘制在屏幕上。但是,当我在控制台上运行相同的命令时,我可以得到结果。我认为代码和数据同时运行,一个正在击败另一个。
//Global scope
DestinationCollection = new Meteor.Collection("Destinations");
destinations = DestinationCollection.find();
if (Meteor.isClient) {
Template.searchMap.rendered = function () {
var airportData = [];
var mapOptions = {
zoom: 3,
center: new google.maps.LatLng(45.4158, -89.2673),
mapTypeId: google.maps.MapTypeId.HYBRID,
mapTypeControl: false,
panControl: false,
streetViewControl: false
};
var map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
var airportArray = new google.maps.MVCArray([]);
destinations.forEach(function(destination){
airportArray.push(new google.maps.LatLng(destination.Geolocation.Latitude, destination.Geolocation.Longitude));
});
var heatmap = new google.maps.visualization.HeatmapLayer({
data: airportArray,
radius: 20
});
heatmap.setMap(map);
};
}
我提出的唯一解决方案是用destinations.forEach
包裹Deps.autorun
:
Deps.autorun(function(){
destinations.forEach(function(destination) {
airportArray.push(new google.maps.LatLng(destination.Geolocation.Latitude, destination.Geolocation.Longitude));
});
});
这有效,但每当我向集合中添加一个新文档时,计数加倍并增加1.例如,如果我有10个项目并且我在集合中再添加1个,那么MVCArray将有21个数组元素而不是11个。
长话短说,获取集合的正确方法是什么,最初通过本地集合进行解析,然后只获取添加到集合中的新值,而不是整个事物。
答案 0 :(得分:1)
查看observe
或observeChanges
(docs)而不是Deps.autorun
:
destinations.observe({
added: function (doc) {
airportArray.push(new google.maps.LatLng(doc.Geolocation.Latitude,
doc.Geolocation.Longitude));
// Add code to refresh heat map with the updated airportArray
}
});