基于会话变量的订阅和连接

时间:2015-01-31 07:15:46

标签: meteor

我想在Google Maps API驱动的地图上显示尚未被特定人员访问的路标。

我目前在MongoDB中有两个集合。

  • 航路点:包括位置和guid(以及其他内容)
  • 访问:由玩家的指南和航点指南组成

我想要的是:

  • 发送到客户端的航点只是可以出现在当前地图范围内的航点。
  • 如果移动地图(边界发生变化),则会根据需要显示新的航点。理想情况下,旧的将从客户端中移除,因为它们也不在视野范围内。
  • 如果添加了新航点,则会将其添加到此人的地图中。
  • 如果该玩家随后访问该航点,则将相关记录添加到访问数据库将导致航点从地图中消失。
  • 如果删除或更新航点,也会在地图上删除或更新航点。

我对Meteor来说还是一个新手,虽然我认为我理解一个订阅(甚至是同一个系列的多个订阅),但我很难找到一个没有反应的解决方案。涉及将大量数据注入浏览器。

我在弄清楚如何将其组合成简单的东西时遇到了问题。我担心没有办法,但选择的链接会有所帮助。

1 个答案:

答案 0 :(得分:0)

当你描述声音可行时。首先看一下understanding Meteor publish/subscribe,然后重新审视问题。

我构建出版物的方式如下:

// server - takes care of requirements 1, 3 and 5
Meteor.publish('waypoints-within-bounds', function publishFunction(bounds) {
  return Waypoints.find({
    location: {
      $geoWithin: {
        $box: [ bounds.bottomLeft, bounds.upperRight ]
      }
    },
    guid: {
      $nin:  // array of visited waypoint guids; Mongo doesn't have joins
    }
  });
});


// client - this takes care of requirement #2
Tracker.autorun(function () {
  Meteor.subscribe('waypoints-within-bounds', Session.get('mapBounds'));
});

function updateMapBounds() {
  var bounds = map.mapObject.getBounds();
  // massage developers.google.com/maps/documentation/javascript/reference#LatLngBounds
  // to match MongoDB's $box parameter order: [...]
  Session.set('mapBounds', bounds);
}

google.maps.event.addListener(map.mapObject, 'center_changed', updateMapBounds);
google.maps.event.addListener(map.mapObject, 'zoom_changed', updateMapBounds);

以上是对Google Maps API的原始调用,但您可能希望使用dburles:google-maps

现在我们需要处理最后一个要求:"如果该玩家随后访问该航路点,则将相关记录添加到访问数据库将导致航点从地图中消失。"使用Meteor.method做得最好,当您访问航点时,您将从客户端拨打电话。

展望未来,您可能希望改为使用template-level subscriptionskeep an eye on this feature making it into Meteor core