【发布时间】:2013-08-21 15:46:23
【问题描述】:
我正在做一个项目,我想在地图上显示标记。
这些标记应该从带有视口约束的服务器发布。这意味着只发布当前用户视口内的标记。
出版物看起来像这样:
//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);
});
到目前为止,一切正常。 此外,我在帖子上创建了一个观察函数,它在调用“添加”时呈现一个标记,并在调用“移除”时呈现一个标记。观察对于渲染新标记和销毁旧标记非常好
//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
这个问题是在整个 Posts-Collection 上触发了观察回调。但我只想显示用户视口内的标记。这就是为什么我通常必须这样做:
//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。
有谁知道如何做到这一点? 也许有一种方法可以将我从订阅中获得的帖子直接推送到地图而不使用 minimongo 上的查询?
【问题讨论】:
-
如何发布一个在服务器端进行过滤的新集合并在客户端订阅它?您可能必须以某种方式发送边界。嗯..可能行不通。
-
我已经在服务器端有一个 pulication 并且每次我的视口更改时都会调用它。例如,在 viewport_1 中,我有 3 个标记,而 viewport_2 提供了 2 个制造商,而不是我在客户端的 postsCollection 包含 5 个标记。这就是为什么我必须通过 minimongo 进行一些查询。但是minimongo没有提供必要的参数:(
标签: meteor observer-pattern publish-subscribe meteorite