Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在全局辅助对象(Meteor)中设置地理位置_Javascript_Node.js_Meteor_Geolocation_Google Geocoder - Fatal编程技术网

Javascript 在全局辅助对象(Meteor)中设置地理位置

Javascript 在全局辅助对象(Meteor)中设置地理位置,javascript,node.js,meteor,geolocation,google-geocoder,Javascript,Node.js,Meteor,Geolocation,Google Geocoder,我试图在助手中设置这样的地理位置信息。我使用这些软件包: 千年发展目标:地理定位, 奥尔德德:地理编码器 这是我的助手: Template.registerHelper("geo", function () { var geo = Geolocation.latLng() || { lat: 0, lng: 0 }; if(geo.lat !== 0){ var infos = Meteor.call('locationName', geo.lat, geo

我试图在助手中设置这样的地理位置信息。我使用这些软件包:

千年发展目标:地理定位, 奥尔德德:地理编码器

这是我的助手:

Template.registerHelper("geo", function () {
  var geo = Geolocation.latLng() || { lat: 0, lng: 0 };

  if(geo.lat !== 0){
    var infos = Meteor.call('locationName', geo.lat, geo.lng, function(err, res){
        return res[0];
    });
  }
});
这是返回的对象

这是我的服务器呼叫

Meteor.methods({
  locationName: function(lat, lng){
  console.log(lat, lng);
  var geo = new GeoCoder({
    geocoderProvider: configs.geocoder.geocoderProvider,
    httpAdapter: configs.geocoder.httpAdapter,
    apiKey: configs.geocoder.apiKey
  });

  var reverseGeocoding = geo.reverse(lat, lng);

  return reverseGeocoding;
}
});
我试了很多东西,但我的{{geo.city}总是空的。我怎样才能正确地构建它


谢谢你

你正处在一个典型的问题。查看模板助手的代码。它基本上是这样做的:

Template.registerHelper("geo", function () {
  // inside helper
  // doing some stuff...
  Meteor.call('someMethod', function(err, res){
    // Other scope!
    console.log("Toto, I've a feeling we're not in the `geo` helper any more.");
    return res; // returning this to nowhere
  });
  // back inside helper
  return undefined; // returns before the above callback even triggers
});
问题是,您不能从方法调用的回调返回某些内容,而期望从中调用该方法的帮助器返回此值:它们是不同的作用域,因为方法调用是异步的。以下是您可以做的:

Template.registerHelper("geo", function () {
  return Session.get('locationName');
});

updateLocationName = function (geo) {
  return Meteor.call('locationName', geo.lat, geo.lng, function(err, res){
        Session.set('locationName', res[0]);
  });
}

if (Meteor.isClient) {
  Meteor.startup(function () {
    var geo = Geolocation.latLng() || { lat: 0, lng: 0 };
    Session.setDefault('locationName', null);
    if(geo.lat !== 0){
      var infos = updateLocationName(geo);
    }
  });
}

例如,如果您想在onRendered或autorun中更新会话变量,您只需使用更新的Geolocation.latLng对象调用updateLocationName。

我使它工作了,但可能有更好的方法。谢谢你的回答!这是我的密码

Template.registerHelper("geo", function () {

if(Session.get('geolocation') === null){
    var geo = Geolocation.latLng() || { lat: 0, lng: 0 };

    if(geo.lat !== 0){
        Meteor.call('locationInfos', geo.lat, geo.lng, function(err, res){
            Session.set('geolocation', res[0]);
        });
    }
}

return Session.get('geolocation');

});

我在Meteor.startup中将会话变量设置为NULL。

为什么使用res[0]?尝试使用res.city…我认为OP意味着res[0]包含具有city属性的对象。你是对的,但它不起作用。谢谢你关于范围的回答,我尝试了很多东西。。。在Meteor.startup中,geo变量设置为{lat:0,lng:0}。我需要在第一次加载时设置它。