订阅完成后如何在客户端上运行方法

时间:2013-04-18 19:53:12

标签: javascript meteor publish-subscribe

这是我的设置:

//in global.js file
items = new Meteor.Collection("items");

//on server in main.coffee
Meteor.publish "nearItems", (lat, lng) ->
  return items.find( { loc : { $near : [lng, lat] } })

//on client in map.coffee
Meteor.autosubscribe -> 
  Meteor.subscribe( "nearItems", 37.78, -122.416, addMarkers)

addMarkers = ->
  places = items.find().fetch()
  console.log "Adding this many markers:", items.length 
  for item, i in places
    theLatLng = new google.maps.LatLng(item.loc[1], item.loc[0])
    addMarker theLatLng, map, item 
  return

当客户端获取数据时,如何调用方法addMarkers。

文档说我需要调用ready方法http://docs.meteor.com/#meteor_publish,但是对于我当前的设置,我不确定如何执行此操作,因为我无法在return语句之前调用ready,因为它还没有准备好。

Meteor.publish语句工作正常,我得到了客户端上的所有项目。但是加载需要几秒钟。所以我需要一种方法来等待项目集合包含来自服务器的所有数据。我可以打开javascript控制台,等待几秒钟后,在地图上正确调用addMarkers和最接近的100显示器。

我尝试设置Deps.autorun(runFunc),请参阅http://docs.meteor.com/#deps_autorun,但无论出于何种原因,它都说集合项目不存在。

1 个答案:

答案 0 :(得分:4)

我不知道你在使用autorun时遇到错误的原因。如果您粘贴有问题的代码,也许我可以提供帮助。我处理这个问题的方法是:

Meteor.autorun( =>
  sub = Meteor.subscribe("collection", param1, param2)

  if sub.ready()                  # Ready is reactive. Once it changes 
                                  # the computation is invalidated

    addMarkers()                  # Now the data is at the client
    Session.set("loading", false) # Do your main thing based on "loading"
  else
    Session.set("loading", true)  # Do some reactive waiting based on "loading"
)