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上使用查询?
如何发布新的一套确实在服务器端这个过滤和订阅它的客户端?您可能不得不以某种方式发送界限。嗯..可能不行。 –
我已经在服务器端有一个提示,并且每次我的视口更改时都会调用它。例如,在viewport_1中,我有3个标记,viewport_2提供2个制作者,而我的postsCollection在客户端包含5个标记。这就是为什么我必须通过minimongo做一些查询。但minimongo不提供必要的参数:( – chaosbohne