2016-05-31 7 views
0

私はこの問題を解決するために成功しなかった。 getCurrentPosition()は約束を返し、.then()関数内の$ scope.map.centerを呼び出すと動作することを理解しています。また、$ scopeはダイジェストサイクルで実行され、プロミスが解決されたときにそのプロパティとオブジェクトが更新されることも理解しています。私はこのすべてに新しいです、そして、私は理にかなっていることを願っています。

しかし、console.log($ scope.map)が期待通りに動作し、{map.center}}が期待どおりに表示されるがconsole.log(map.center)が表示されるため、 .then()関数の外に空のオブジェクトを返します。

ご協力いただきありがとうございます。

$scope.map = { 
 
      control: {}, 
 
      center: {}, 
 
      zoom: 16 
 
     }; 
 

 
    $geolocation.getCurrentPosition({ 
 
     timeout: 60000, 
 
     maximumAge: 250, 
 
     enableHighAccuracy: true 
 
    }).then(function(position) { 
 
     $scope.map.center.latitude = position.coords.latitude; 
 
     $scope.map.center.longitude = position.coords.longitude; 
 
    }); 
 

 

 
    //Output 
 
    
 
    console.log($scope.map); //returns full object including data within $scope.map.center 
 

 
    console.log($scope.map.center); //returns an empty object. I am looking to convert this to an array using lodash.
{{ map.center }} works fine and returns the coordinates of my current location

**編集(コンソールのアップロードされた画像)**

This is what I see in the console. First object is $scope.map Second object is $scope.map.center

答えて

0

then関数は、getCurrentPositionが終了したときに呼び出され(非同期です)、データをクライアントに送り返します。それはあなたがそれによって取り出されたデータに確実にアクセスできる唯一の場所です。非同期呼び出しを行う場合は、データにアクセスするために関数thenを使用する必要があります。それは呼び出しが行われた後に起こることです。 then(関数外)に続くコードは、getCurrentPositionが呼び出された直後に実行されます。

他の関数をthen関数から呼び出して、このコードを置く場所を探しているだけの場合は、positionオブジェクトを渡すことができます。

$scope.map = { 
     control: {}, 
     center: {}, 
     zoom: 16 
    }; 

$geolocation.getCurrentPosition({ 
    timeout: 60000, 
    maximumAge: 250, 
    enableHighAccuracy: true 
}).then(processMap(position)) 

function processMap(position) { 
    $scope.map.center.latitude = position.coords.latitude; 
    $scope.map.center.longitude = position.coords.longitude; 
    console.log($scope.map); 
    console.log($scope.map.center); 
}; 

あなたはasynchonous通話の詳細を探している場合は、この説明を参照してください。

http://docs.apigee.com/api-baas/asynchronous-vs-synchronous-calls

+0

詳細な回答ありがとうございます!あなたの説明でそれを見逃したら私を許してください。しかし、私はなぜ$ scope.mapが最初に働いたのか疑問に思っています。 – nubianrover

+0

それは本当にしなかったか、コントローラの機能の上に作成したオブジェクトを取得していたか、呼び出しが部分的に終了した可能性があります。 –

+0

もう少しチェックをした後、私は今、HTML5 GeolocationがCoordinatesという特別なオブジェクトタイプを返すという事実と関係があると考えています。それは今私の好奇心を満足させるでしょう。しかし、その後、私は間違っているかもしれません。 – nubianrover

0

getCurrentPosition()コールは非同期です。したがって、ログに$scope.map$scope.map.centerを呼び出すと、最初に定義したものが返されます。

データは、ajax呼び出しが終了するとスコープ内でのみ設定されます。

+0

あなたは、彼らは両方とも私が最初になるためにそれらを定義したものを返すべきであると述べました。 log $ scope.mapを呼び出すと、$ scope.map ['center']に保存された座標を含む完全なオブジェクトが返されました。一方、$ scope.map.centerを呼び出すと、空のオブジェクトが返されました。それが私を悩ますものです。両方とも空のオブジェクトが返されても問題ありません。 – nubianrover

+0

@nubianrover変更がスコープに反映されていることを確認するには '' $ apply'''を呼び出す必要があるようです。 http://stackoverflow.com/questions/23185619/how-can-i-use-html5-geolocation-in-angularjs – jtmingus

関連する問題