2014-07-19 14 views
7

Ich bin ein meteor.js Nuub, aber ich habe ziemlich viel Zeit damit verbracht, diesen herauszufinden.Meteor.js reaktive html5 geolocation position.coords

Ich versuche, meine Benutzeroberfläche basierend auf dem HTML5-Geolocation-API-Callback, der in getCurrentPosition übergeben wurde, reaktiv zu aktualisieren. Die Benutzeroberfläche wird jedoch nicht mit meinem aktuellen Code aktualisiert.

Können Sie Vorschläge und/oder eine Lösung anbieten? Hier sind die Details:

Basics: Meteor-Server ausgeführt wird, dient andere Daten zu/von Mongo über Sammlungen erfolgreich

Ich habe eine Hauptseite (main.html):

<head> 
    <title>Geolocation</title> 
</head> 
<body> 
<div class="container"> 
    <header class="navbar"> 
    <div class="navbar-inner"> 
     <a class="brand" href="/">Geolocation</a> 
    </div> 
    </header> 
    <div id="locationDemo"> 
    {{> location}} 
    </div> 
</div> 
</body> 

dass Referenzen eine Vorlage (location.js):

<template name="location"> 
    <div> 
    Lat: {{lat}} 
    </div> 
    <div> 
    Lon: {{lon}} 
    </div> 
</template> 

, die diese im Zusammenhang Helfer (location.js) hat:

_lat = { 
    current: 0, 
    dep: new Deps.Dependency, 
    get: function(){ 
    this.dep.depend(); 

    if(this.current === 0){ 
     getLocation(); 
    } 

    return this.current; 
    }, 
    set: function(value){ 
    this.current = value; 
    this.dep.changed(); 
    Deps.flush(); 
    return this.current; 
    } 
}; 

_lon = { 
    current: 0, 
    dep: new Deps.Dependency, 
    get: function(){ 
    this.dep.depend(); 

    if(this.current === 0){ 
     getLocation(); 
    } 

    return this.current; 
    }, 
    set: function(value){ 
    this.current = value; 
    this.dep.changed(); 
    Deps.flush(); 
    return this.current; 
    } 
}; 

function getLocation(){ 
    if (navigator.geolocation) 
    { 
    navigator.geolocation.getCurrentPosition(showPosition, showError); 
    } 
    else{ 
    console.log("Geolocation is not supported by this browser."); 
    } 
} 

function showPosition(position) 
{ 
    _lat.set(position.coords.latitude); 
    _lon.set(position.coords.longitude); 
} 

function showError(error) { 
    switch(error.code) { 
    case error.PERMISSION_DENIED: 
     console.log("User denied the request for Geolocation."); 
     break; 
    case error.POSITION_UNAVAILABLE: 
     console.log("Location information is unavailable."); 
     break; 
    case error.TIMEOUT: 
     console.log("The request to get user location timed out."); 
     break; 
    case error.UNKNOWN_ERROR: 
     console.log("An unknown error occurred."); 
     break; 
    } 
} 

Template.location.helpers({ 
    lat: _lat.get(), 
    lon: _lon.get() 
}); 
+0

hinzuzufügen erwarten Sie es zu aktualisieren, wenn sich 'navigator.geolocation.getCurrentPosition' ändert? Wenn das so ist, werden Sie wahrscheinlich eine Deps.autorun benötigen, aber selbst dann bin ich mir nicht sicher, ob Geolocation als reaktive Datenquelle verwendet werden kann. –

+0

Hey Cristian, ja, ich dachte, dass _lat und _lon als reaktive Variablen verwendet werden könnten. Ich dachte an Deps.autorun, aber ich weiß nicht, wo ich es nennen soll. –

Antwort

4

Soweit ich weiß navigator.geolocation ist keine reaktive Datenquelle. Das wird ohne explizite Abfrage nicht funktionieren. Eine andere Sache, die du falsch gemacht hast, ist, dass deine Helfer keine Funktionen sind, so dass sie nicht wiederholt aufgerufen werden können.

Diese funktionieren könnte (nicht getestet):

Meteor.setInterval(function() { 
    navigator.geolocation.getCurrentPosition(function(position) { 
     Session.set('lat', position.coords.latitude); 
     Session.set('lon', position.coords.longitude); 
    }); 
}, 5000); 

Template.location.helpers({ 
    lat: function() { return Session.get('lat'); }, 
    lon: function() { return Session.get('lon'); } 
}); 
+0

Danke nochmal Christian. Ich habe nur einmal nach dem Ort gefragt (die 'if' Aussage im Getter), aber ich mag die Umfragen Idee. Allerdings wollte ich _lat.get() zur reaktiven Quelle machen, nicht zur Geolocation-API. Geolocation funktioniert, nur nicht das Deps-Zeug. –

+0

Take 2: Christian, du hattest vollkommen recht! Was ich vermisst habe, ist die Bindung des Templates an die _lat & _lon Objekte - worauf auch Slava Kim (meteor google group) hingewiesen hat. Es funktioniert jetzt total. –