为什么地理位置数据不会从帮助程序返回到模板

时间:2015-04-16 20:16:43

标签: meteor meteor-helper

这是我的Meteor代码段 - http://meteorpad.com/pad/sYoY8Xzjzd3sejFC4/Location

如您所见,应该在<p>标记中写下您当前的位置(您可以通过打开浏览器控制台检查res[0].formatted_address是否有任何数据 - 它应该包含您当前的位置)。

但由于某些原因,<p>仍为空。

问题从navigator.geolocation.getCurrentPosition回调开始 - 如果我修改代码,那么数据会在回调之外返回 - 数据会转到<p>

示例:

Template.location.helpers
  location: ->
    navigator.geolocation.getCurrentPosition (position) ->
      if GoogleMaps.loaded()
        geocoder = new google.maps.Geocoder()
        geocoder.geocode {'latLng': new google.maps.LatLng(position.coords.latitude, position.coords.longitude)}, (res, status) ->
          console.log res[0].formatted_address
          res[0].formatted_address
    return 123

我尝试使用Session变量,但它有效 - http://meteorpad.com/pad/nR4vgj7HqJvCdt3wE/Location-Session,但为什么来自回调的信息不会转到模板,以及如何修复

1 个答案:

答案 0 :(得分:1)

这是因为res[0].formatted_address不是像Session变量那样的反应数据。

当帮助者将res[0].formatted_address返回给模板时,值为''。

您可以这样检查。

var test = res[0].formatted_address
 if test != ''
  console.log 'hi iam a non reactive value and also im returning nothing'
 else
   console.log "yea my response is " + res[0].formatted_address

并且你将获得第一个console.log,因为此时你将值返回给模板,值为''

Session变量有效,因为Session是一个被动数据,也有助手运行assyncronus,所以首先帮助器查找Session.get('location') wich值是'' 但是有几秒钟当地理定位的回调完成时,会话的值不同,并且帮助程序的计算重新运行该函数并返回该值。