Meteor和使用值填充数组

时间:2014-09-04 18:43:16

标签: javascript mongodb google-maps meteor data-visualization

我正在玩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个。

长话短说,获取集合的正确方法是什么,最初通过本地集合进行解析,然后只获取添加到集合中的新值,而不是整个事物。

1 个答案:

答案 0 :(得分:1)

查看observeobserveChangesdocs)而不是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
  }
});