En essayant de créer une méthode de géocodage dans le dossier du serveur mais en me plaignant que cette adresse n'est pas définie au chargement de la page. Il semble que la méthode se déclenche au chargement de la page avant que l'entrée ait une valeur (ou ait été appelée) et provoque ce comportement. Existe-t-il un moyen d'attendre que la méthode soit exécutée jusqu'à ce qu'elle soit appelée au lieu de l'être automatiquement ou d'une autre manière? Aldeed: geocoder semble seulement tourner côté serveur.Empêcher la méthode de s'exécuter automatiquement sur le serveur dans Meteor
Ma méthode coffeescript, en utilisant aldeed: géocodage
geocodeAddress: (address) ->
lat = ''
lng = ''
addressVar = ''
geocoder = new GeoCoder(
geocoderProvider: 'google'
httpAdapter: 'https'
apiKey: 'AIzaSyDYjLGrETRt4hPZtXcmzQwRbzlFT1zWwr8')
geocoder.geocode { 'address': address }, (results, status) ->
if status == google.maps.GeocoderStatus.OK
lat = results[0].geometry.location.lat()
lng = results[0].geometry.location.lng()
return [lat,lng]
L'événement Modèle
Template.dashboard.events({
'click #customlocationsubmit'(evt) {
if (document.getElementById("customlocation")) {
customLocationValue = document.getElementById("customlocation").value;
}
if (typeof customLocationValue === 'undefined' || customLocationValue == "") {
return false;
} else {
customUserLocation = Meteor.call('geocodeAddress',customLocationValue);
}
}
});
Le modèle
<template name="dashboard">
<div class="template-dashboard">
<div class="container">
<div class="row">
<div class="col-md-3">
{{> addPost}}
{{> favoritesSidebar}}
</div>
<div class="col-md-9">
<button id="customlocationsubmit" type="submit" class="btn btn-primary">Update</button>
{{> posts}}
</div>
</div>
</div>
</div>
</template>
événement Click pour Styx mis à jour à nouveau
'click #customlocationsubmit'(evt) {
if (document.getElementById("customlocation")) {
customLocationValue = document.getElementById("customlocation").value;
}
if (typeof customLocationValue === 'undefined' || customLocationValue == "") {
return false;
} else {
Meteor.call('geocodeAddress', customLocationValue, (err, result) => {
if (err) {
// handle error
return;
}
const [ lat, lng ] = result;
geoResult = result;
const sortOrder = (Session.get('posts.sortBy') || {}).date || 1;
return Session.set('posts.sortBy', {date: -sortOrder});
return distanceFilter(this, geoResult);
});
}
},
fonction d'aide pour Styx
distanceFilter(location,customUserLocation) {
function getDistanceFromLatLonInMi(lat1,lon1,lat2,lon2) {
var R = 6371; // Radius of the earth in km
var dLat = deg2rad(lat2-lat1); // deg2rad below
var dLon = deg2rad(lon2-lon1);
var a =
Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
Math.sin(dLon/2) * Math.sin(dLon/2)
;
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c; // Distance in km
var e = d * 0.621371;
return e;
};
function deg2rad(deg) {
return deg * (Math.PI/180);
};
getUser = Meteor.users.findOne({
_id: Meteor.userId()
});
if (getUser){
userUserName = getUser.username;
userLocation = getUser.profile.location.split(',');
};
eventLocation = location.split(',');
if (typeof customLocationValue === 'undefined' || customLocationValue == "") {
customUserLocationVar = userLocation;
}
else {
customUserLocationVar = customUserLocation;
console.log(customUserLocation);
}
distance = getDistanceFromLatLonInMi(customUserLocationVar[0],customUserLocationVar[1],eventLocation[0],eventLocation[1]);
eventDistance = Math.round(distance);
filterValue = jQuery('#eventdistance').val();
if (filterValue) {
if (eventDistance <= filterValue) {
return true;
}
} else if (eventDistance <= 20) {
return true;
} else {
return false;
}
},
Où est la définition de la méthode (côté serveur) et le code qui appelle cette méthode du client? –
La méthode est dans le dossier du serveur. La méthode est appelée à partir d'une fonction d'aide à l'intérieur d'un modèle dans une vue – Silicabello
Veuillez montrer le code de la méthode et votre code client - le code ci-dessus est presque complètement hors de propos pour votre problème. Aussi - n'appelez pas les méthodes des helpers, appelez les depuis * events * à la place. Les assistants courent plus souvent que prévu. –