现在我正在开发一款严重依赖用户地理定位的应用。此时我只需要通过该用户的纬度和经度获取用户的地址。要做到这一点,我使用两个包:mdg:geolocation(获取纬度和经度)和meteor-google-reverse-geocode(从纬度和经度转换为地址)。 现在我有以下代码:
import React, { Component, PropTypes } from 'react';
import { Meteor } from 'meteor/meteor';
import { Accounts } from 'meteor/accounts-base';
import { Geolocation } from 'meteor/mdg:geolocation';
import { reverseGeocode } from 'meteor/jaymc:google-reverse-geocode';
export default class Profile extends Component {
setLocation() {
var latLng = Geolocation.latLng();
var lat = latLng.lat;
var lng = latLng.lng;
reverseGeocode.getSecureLocation(lat, lng, function(location) {
Meteor.users.update(Meteor.userId(), {
$set: {"profile.location": reverseGeocode.getAddrStr()}
});
});
}
render() {
return (
<div className="container">
<div className="row">
<div className="col s4">
<User />
</div>
<button onClick={this.setLocation.bind(this)}>Set location</button>
</div>
</div>
)
}
}
我有一个User
组件,显示用户在其他参数中的位置,但首先应该从注册和登录中获取此location
参数(我将实现以后的会话),所以我创建了一个按钮来完成这个技巧,但只有当我点击两次时才会这样做。第一次点击它没有得到任何信息,而不是在控制台中显示我的错误,但当我第二次点击它时,它以某种方式按我的意愿工作,即获取正确的地址,然后在我的User
组件中显示它。好吧,它可以抓取数据,但只有当我点击两次这是不可接受的,因为我想在注册或登录后抓取这些数据,即第一次点击,而不是第二次,但我仍然没有知道怎么做。任何帮助或想法将不胜感激。感谢您花时间致力于描述问题!
UPD
经过一些研究后,我发现Geolocation
功能不具有反应性,可能需要一些时间来加载数据,因此我使用ReactiveVar
使其成为被动的Tracker
在完成计算时手动停止计算。现在我的代码看起来像这样:
setLocation() {
var latLng = new ReactiveVar();
Tracker.autorun(function(computation) {
latLng.set(Geolocation.latLng());
if (latLng.get()) {
computation.stop();
console.log(latLng);
var lat = latLng.lat;
var lng = latLng.lng;
reverseGeocode.getSecureLocation(lat, lng, function(location) {
Meteor.users.update(Meteor.userId(), {
$set: {"profile.location": reverseGeocode.getAddrStr()}
});
});
}
})
}
首次点击时会计算lan
和lng
属性,但Uncaught TypeError: Cannot read property 'formatted_address' of undefined
文件中出现另一个错误google-reverse-geocode.js
。
答案 0 :(得分:2)
好的伙计们,我解决了这个问题。我看了ReactiveVar
输出,发现了我的错误。请参阅输出包含和对象curValue
,其中存储了lan
和lng
属性,因此要提取这些属性,我只需要像latLng.curValue.lat
一样明确地调用它们。这里的固定功能与我在第一篇文章中描述的方式一致:
setLocation() {
var latLng = new ReactiveVar();
Tracker.autorun(function(computation) {
latLng.set(Geolocation.latLng());
if (latLng.get()) {
computation.stop();
console.log(latLng);
var lat = latLng.curValue.lat;
var lng = latLng.curValue.lng;
reverseGeocode.getSecureLocation(lat, lng, function(location) {
Meteor.users.update(Meteor.userId(), {
$set: {"profile.location": reverseGeocode.getAddrStr()}
});
});
}
})
}
希望它有所帮助!