2017-05-10 8 views
0

私はNativescript(コロナ/ Luaデベロッパーになりました)を初めて使用しました。ユーザーの位置を常時取得し、速度と速度でダッシュボードを更新する関数(RuntimeEventListenerと同様です)を作成する必要があります。例えば、高度。Nativescriptロケーションランタイムアップデート

私の現在のコードは、ボタンが押されたときにのみこの情報を取得します(ビルドしようとしているアプリの種類には意味がありません)。問題は、そのようなリスナー/関数を作成して呼び出す方法ですか? 、実際には、リスナー

var Observable = require("data/observable").Observable; 
var frames = require("ui/frame"); 

var orientation = require('nativescript-orientation'); 
    orientation.enableRotation(); // The screen will rotate 
    console.log(orientation.getOrientation()); // Returns the enum DeviceOrientation value 

var dialogs = require("ui/dialogs"); 

// Get geo coordinates 
var geolocation = require("nativescript-geolocation"); 
if (!geolocation.isEnabled()) { 
     geolocation.enableLocationRequest(); 
} 
/* 
var watchID 
watchId = geolocation.watchLocation(
    function (loc) { 
     if (loc) { 
      console.log("(watchid) Received location: " + loc); 
     } 
    }, 
    function(e){ 
     console.log("(watchid) Error: " + e.message); 
    }, 
    {desiredAccuracy: 3, updateDistance: 10, minimumUpdateTime : 1000 * 20}); // should update every 20 sec according to google documentation this is not so sure. 
*/ 


    //variables for the dashboard and the Origin 
    var originLoc //holds the lat,long of the starting point 
    var originHeading = "NNW" 
    var originTime = "0" 
    var originDistance = "0" 

    var mySpeed = "0" 
    var myDuration = "00:00" 
    var myDistance = "0" 
    var myAltitude = "0"; 
    var myDirection; 

    var butAction = "START" //button action when it starts 

var fbMeasurement = "imperial"; 

//Sets the right heading of the compass (if landscape, subtracts 90 degrees) 
function headingCompass(args) { 
    var compassHead = ""; 

    if (args>12 && args<=34) { 
     compassHead = "NNE"; 
    } else if (args>34 && args<=57) { 
     compassHead = "NE"; 
    } else if (args>57 && args<=80) { 
     compassHead = "ENE"; 
    } else if (args>80 && args<=102) { 
     compassHead = "E"; 
    } else if (args>102 && args<=124) { 
     compassHead = "ESE"; 
    } else if (args>124 && args<=147) { 
     compassHead = "SE"; 
    } else if (args>147 && args<=170) { 
     compassHead = "SSE"; 
    } else if (args>170 && args<=192) { 
     compassHead = "S"; 
    } else if (args>192 && args<=215) { 
     compassHead = "SSW"; 
    } else if (args>215 && args<=237) { 
     compassHead = "SW"; 
    } else if (args>237 && args<=260) { 
     compassHead = "WSW"; 
    } else if (args>260 && args<=282) { 
     compassHead = "W"; 
    } else if (args>282 && args<=305) { 
     compassHead = "WNW"; 
    } else if (args>305 && args<=327) { 
     compassHead = "NW"; 
    } else if (args>327 && args<=350) { 
     compassHead = "NNW"; 
    } else { 
     compassHead = "N"; 
    } 
    return compassHead; 
} 



//Gets current location when app starts 
var geolocation = require("nativescript-geolocation"); 
if (!geolocation.isEnabled()) { 
     geolocation.enableLocationRequest(); 
} 
var location = geolocation.getCurrentLocation({desiredAccuracy: 3, updateDistance: 10, maximumAge: 20000, timeout: 20000}). 
then(function(loc) { 
    if (loc) { 
     console.log("Current location is: " + loc); 
     originLoc = loc; 
     if (fbMeasurement === "imperial") { 
      myAltitude = parseInt(loc.altitude * 3.28084); 
      mySpeed = (loc.speed * 2.23694).toFixed(1); 
     } else { 
      mySpeed = loc.speed.toFixed(1); 
      myAltitude = parseInt(loc.altitude); 
     } 
     myDirection = headingCompass(loc.direction) 
    } 
}, function(e){ 
    console.log("Error: " + e.message); 
}); 


function createViewModel() { 
    var viewModel = new Observable(); 

    viewModel.originHeading = originHeading; 
    viewModel.originTime = originTime; 
    viewModel.originDistance = originDistance; 

    viewModel.mySpeed = mySpeed; 
    viewModel.myDuration = myDuration; 
    viewModel.myDistance = myDistance; 
    viewModel.myAltitude = myAltitude; 

    viewModel.butAction = butAction; 


    //STARTs 
    var watchid; 
    viewModel.onTapStart = function(args) { 
     if (butAction==="START") { 

      //change button color to RED 
      var btn = args.object; 
      btn.backgroundColor = "#FF0000"; 
      //change button text to "STOP" 
      this.set("butAction","STOP"); 
      butAction = "STOP"; 

      watchId = geolocation.watchLocation(
      function (loc) { 
       if (loc) { 
        console.log("Received location: " + loc); 

        if (fbMeasurement === "imperial") { 
         myAltitude = parseInt(loc.altitude * 3.28084); 
         mySpeed = (loc.speed * 2.23694).toFixed(1); 
        } else { 
         mySpeed = loc.speed.toFixed(1); 
         myAltitude = parseInt(loc.altitude); 
        } 
        myDirection = headingCompass(loc.direction); 


       } 
      }, 
      function(e){ 
       console.log("Error: " + e.message); 
      }, 
      {desiredAccuracy: 3, updateDistance: 10, minimumUpdateTime : 1000 * 1}); // should update every 20 sec according to google documentation this is not so sure. 

     } else { 
      //change button color to GREEN 
      var btn = args.object; 
      btn.backgroundColor = "#00FF00"; 
      //change button text to "START" 
      this.set("butAction","START") 
      butAction = "START"; 

      if (watchId) { 
       geolocation.clearWatch(watchId); 
      } 
     } 


     this.set("myAltitude",myAltitude); 
     this.set("mySpeed",mySpeed); 
     this.set("myDistance",myDirection); 



    } 

    return viewModel; 
} 

exports.createViewModel = createViewModel; 

答えて

0

watchlocation方法があり、それが変更されたとき、あなたの場所を更新します(このargumentsに基づいて:私はJavaScriptでコーディングし、その下にい

は私の現在のコードです)。ただし、の可視性プロパティを使用して情報を更新し、必要なときにいつでも再利用する必要があります。また、Androidでは、ある距離後に位置がトリガされることがあります(私の場合は、約100ステップで、ドットの後ろの4番目の記号に違いがあります)。

もしあなたがMVVM patternをよく知っていれば、これはNativeScriptアプリケーションで定期的に使用されるものです。 Here you can find the article for Data Binding in NativeScript

だから基本的にはちょうどあなたの時計機能を実行する(例えば使用してページためイベントをロード)してから(例えば観測可能なプロパティの緯度を作成し、更新情報を使用するときに必要な場所)

観察可能なモデルでの変更を監視

vm = new Observable(); 
vm.set("altitude", someDefaultValue); 
vm.set("longitude", someDefaultValue); 

geolocation.watchLocation(function(loc) { 
    vm.set("altitude", loc.altitude); 
    vm.set("longitude", loc.longitude); 

    console.log(vm.get("altitude")); // Observable model updated 
    console.log(vm.get("longitude")); 
})