2016-09-01 6 views
0

私のフォームのZipcodeフィールドをAngularで検証しようとしています。標準のDirectionsService.route()では不可能であることが証明されています$ httpリクエストを作成しようとしています。 メソッドを指定しないと、CORSエラーが発生します。メソッドをJSONPに設定すると、それはうまくいきますが、私のthen()関数には当てはまりません。私はちょうど解析エラーを取得します。私はドキュメントのように、私のURLにコールバックを追加しようとしましたが、それを修正するために何もしませんでした。Angular to Google Maps APIでAJAXリクエストを作成できないのはなぜですか

私はこの方法を使用できない場合、Directions APIはドキュメント全体で非常に多くの例のURLを提供しています(「https://maps.googleapis.com/maps/api/directions/json?origin=Toronto&destination=Montreal&key=YOUR_API_KEY」など)。

var url = 'https://maps.googleapis.com/maps/api/directions/json?origin=53703&destination=54481&key=AIzaSyBXbK2tp2WmjBsnwS8QNiqH7QMKxMIZ86A&callback=JSON_CALLBACK'; 
      $http({method:'get', url: url}).then(function(response){ 
       var data = JSON.parse(angular.fromJson(response.data)); 
       console.log(data); 
      }); 

これを変更して適切なリクエストを行うことはできません。しかし、それらが表示され続けることが可能でなければなりませんexamples with URLsだけでなく、directionsService、角度でカスタム検証のために動作しません。

directionsService.route({ 
     origin: '53075', 
     destination: '"'+zip+'"', 
     travelMode: 'DRIVING' 
    }, this.getDistanceCallback); 
+0

'angular.fromJson'は何をしますか? 'JSON.parse'は文字列を要求します。 'fromJson'の出力から何を供給しているのでしょうか?文字列を逆シリアル化しようとしているように見え、最初の逆シリアル化から結果のオブジェクトを冗長に逆シリアル化するように見えます(ただし、これはもう文字列ではなく、逆シリアル化されています)。 'JSON.parse' *または*' angular.fromJson'(両方ではない)だけを使うとどうなりますか? – apsillers

+0

@apsillers angular.fromJsonはJSON文字列を逆シリアル化します。私は過去数日間に非常に多くの異なることを試みましたので、物事は濁っていますが、私はオブジェクトや文字列を取り戻していませんでした。それは奇妙だった。しかし、JSON.parseを実行した後、JSオブジェクトのように解析できます。その行は、解析エラーとはまったく関連がありません。それはちょうど私の古いコールバック関数から引き継がれました。私の.then()内のすべてがコメントアウトされても、解析エラーが発生しました。 – pinksharpii

答えて

0

私はMapquest APIに切り替えて問題を解決しました。 Googleマップのエンドポイントで何が問題になっているかは完全にはわかりません。しかし、MapquestはAJAXのリクエストを簡単にAngularで行うことができました。

0

あなたが戻ってくる方向であなたが何をしているのか分かりませんが、routeoverview_pathのすべてのノードをリストする簡単なアプリをセットアップできました。

1つの点は、<script async defer src="...">ではなく、Maps APIを同期して読み込むことです。私はサービスを利用し始めることができるときはいつでも解決すると思われるサービス工場を作らなければならないのは奇妙なことだと思います。あなたはそれをすることができます、ちょっと変です。

(function() { 
 
    "use strict"; 
 

 
    var mapApp = angular.module("map-app", []); 
 

 
    mapApp.service("MapSrvc", function($q) { 
 
    var directionsService = new google.maps.DirectionsService; 
 

 
    this.getDirections = function(start, end, mode) { 
 
     mode = mode || "DRIVING"; 
 
     var deferred = $q.defer(); 
 

 
     directionsService.route({ 
 
     origin: start.toString(), 
 
     destination: end.toString(), 
 
     travelMode: mode 
 
     }, function(response, status) { 
 
     if (status === "OK") { 
 
      deferred.resolve(response); 
 
     } else { 
 
      deferred.reject("Something went wrong"); 
 
     } 
 
     }); 
 

 
     return deferred.promise; 
 
    }; 
 
    }); 
 

 
    mapApp.controller("MapCtrl", function($scope, MapSrvc) { 
 
    $scope.start = 53075; 
 
    $scope.end = 54481; 
 
    $scope.mode = "DRIVING"; 
 
    $scope.modes = [{ 
 
     name: "Driving", 
 
     mode: "DRIVING" 
 
    }, { 
 
     name: "Walking", 
 
     mode: "WALKING" 
 
    }, { 
 
     name: "Transit", 
 
     mode: "TRANSIT" 
 
    }]; 
 
    $scope.directions = []; 
 
    $scope.submitHandler = function() { 
 
     MapSrvc.getDirections($scope.start, $scope.end, $scope.mode).then(function(directions) { 
 
     $scope.directions = directions.routes[0].overview_path.map(function(latlng) { 
 
      return { 
 
      lat: latlng.lat(), 
 
      lng: latlng.lng() 
 
      } 
 
     }); 
 
     }); 
 
     return false; 
 
    } 
 
    }); 
 
}());
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js"></script> 
 
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyBXbK2tp2WmjBsnwS8QNiqH7QMKxMIZ86A"></script> 
 

 

 
<main ng-app="map-app"> 
 
    <h1>Mapper</h1> 
 
    <div ng-controller="MapCtrl"> 
 
    <section> 
 
     <h2>Where do you want to go?</h2> 
 
     <form name="mapper" ng-submit="submitHandler()"> 
 
     <fieldset> 
 
      <legend>Travel Parameters</legend> 
 
      <ul> 
 
      <li> 
 
       <label for="start">Start</label> 
 
       <input id="start" type="text" ng-model="start"> 
 
      </li> 
 
      <li> 
 
       <label for="end">End</label> 
 
       <input id="end" type="text" ng-model="end"> 
 
      </li> 
 
      <li> 
 
       <select ng-model="mode" ng-options="mode.mode as mode.name for mode in modes"></select> 
 
      </li> 
 
      <li> 
 
       <input type="submit"> 
 
      </li> 
 
      </ul> 
 
     </fieldset> 
 
     </form> 
 
    </section> 
 
    <section> 
 
     <h2>Directions</h2> 
 
     <ul> 
 
     <li ng-repeat="direction in directions track by $index">{{direction.lat}}, {{direction.lng}}</li> 
 
     </ul> 
 
    </section> 
 
    </div> 
 
</main>

+0

これはMapquest APIの最終コードです。 http://grab.by/Sulw既存の適切な郵便番号であることを確認するだけです。私の問題は、$ asyncValidatorsで検証するためのディレクティブ(コントローラーではありません)に必要なことでした。 Google Mapsの標準的な非同期コールバックのヒット方法を理解できませんでした。非同期延期についてのご注意ありがとうございます。私はそれを取り除くことを決して考えなかったでしょう。私はそれが非同期要求を持っている方が良いと聞いた。次回はGoogleマップを再度使用することを決めた場合には、このことを覚えておきます。 – pinksharpii

+0

@pinksharpiiああ、そうです。はい、非同期/遅延プロパティを持つ方がページが停止しないようにする方がよいでしょう。 '$ asyncValidators'を他の人が同様の問題を抱えている場合に動作させる方法があるかどうかがわかります。 – zero298

関連する問題