2013-08-19 150 views
1

我正在研究一个项目,我想在地图上显示标记。出版物订阅观察

这些标记应该从具有视口约束的服务器发布。这意味着只发布标记在当前用户视口内。

出版看起来是这样的:

//server 
Meteor.publish('posts', function(bottom_left_x, bottom_left_y, upper_right_x, upper_right_y, limit) { 

    return Posts.find({locs: {$geoWithin: {$box: 
            [[bottom_left_x, bottom_left_y], 
            [upper_right_x, upper_right_y]]}}}, 
         {sort: {submitted: -1}, limit: limit}); 
}); 

我总是通过订阅时调用这个函数我map_center变化:

//client 
google.maps.event.addListener(map, 'idle', function(event) { 
    var bounds = map.getBounds(); 

    var ne = bounds.getNorthEast(); 
    var sw = bounds.getSouthWest(); 
    postsHandle= Meteor.subscribe('posts', sw.lat(), sw.lng(), ne.lat(), ne.lng(), 10); 
}); 

到目前为止一切工作正常。 此外,我在帖子上创建了一个观察函数,它在调用“added”时呈现标记,并在调用“removed”时删除。观察是非常好的渲染新的标记和摧毁旧的

//client 
Posts.find().observeChanges({ 
    added: function(post) { 
    // when 'added' callback fires, add HTML element 
    var marker = new google.maps.Marker({ 
     position: new google.maps.LatLng(post.locs.lat, post.locs.lng), 
     postId: post._id, 
     map: map, 
    }); 
},removed .... and so on 

这问题是观察,触发回调对整个帖子收集。但我只想显示用户视口内的标记。这就是为什么我通常必须这样做:

//client 
Posts.find({locs: {$geoWithin: {$box: 
            [[bottom_left_x, bottom_left_y], 
            [upper_right_x, upper_right_y]]}}}, 
         {sort: {submitted: -1}, limit: limit}).observeChanges({ 

但那不可能。在minimongo中不支持GeoWithin,并且无法使用具有限制的集合调用oberserve。

有没有人知道如何做到这一点? 也许有一种方法可以将我从subcription中直接获取的帖子推送到地图上,而无需在minimongo上使用查询?

+0

如何发布新的一套确实在服务器端这个过滤和订阅它的客户端?您可能不得不以某种方式发送界限。嗯..可能不行。 –

+0

我已经在服务器端有一个提示,并且每次我的视口更改时都会调用它。例如,在viewport_1中,我有3个标记,viewport_2提供2个制作者,而我的postsCollection在客户端包含5个标记。这就是为什么我必须通过minimongo做一些查询。但minimongo不提供必要的参数:( – chaosbohne

回答

1

解决方案非常简单!

Meteor.autosubscribe(function() { 
    Meteor.subscribe('chat', { room: Session.get('currentRoom') }); 
}); 

如果要限制订阅的视图界面更改视图的视图比您必须使用自动订阅。看来,autosubscribe照顾改变订阅的论据:)的

Meteor.autosubscribe(function() { 
    var a = Session.get('bounds'); 
    if(a) 
    Meteor.subscribe('posts', a.swlat, a.swlng, a.nelat, a.nelng, 5); 
});