【问题标题】:Angular geocoding results not synchronous角度地理编码结果不同步
【发布时间】:2015-07-05 05:04:10
【问题描述】:

我正在尝试使用 google 地理编码作为 POC 来处理我可能正在开发的功能,但是我遇到了问题。

基本上它从用户在搜索输入中输入他们的地址开始,地理编码服务返回地址列表,因为不同的地址可能发生在不同的位置或者如果用户拼写错误,所以用户可以选择正确的。

所以第一步搜索(角度控制器):

$scope.submit = function(addressform) {
      $scope.addresses = geocoder.getAddressList($scope.formData.address);
}

Geocoder 是一个使用 google map 和 google geocoder 的内部工厂。这是此示例的相关地理编码器代码:

app.factory('geocoder', function(GoogleMap) {
  var geocoder = new google.maps.Geocoder(),
  return {
    getAddressList: function(address) {
      geocoder.geocode( { 'address': address }, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
          return results;
        } else {
          alert("Couldn't find that address! Google Maps says: " + status);
        }
      });
    }
  }
}); 

这是视图部分:

<ul>
  <li ng-repeat='address in addresses'>
    <a ng-click='displayOnMap()'>{{address.place_id}}</a>
  </li>
</ul>

这应该将地理编码结果写入视图。我遇到的问题是调用地理编码器方法执行的控制器立即返回,但在此之后地理编码器实际上返回结果。

如何让角度控制器等到地理编码器实际调用 return 语句并返回结果,然后我才能更新我的 html?

【问题讨论】:

    标签: javascript angularjs google-maps google-maps-api-3


    【解决方案1】:

    您将无法逃避geocoder.geocode 是异步的事实。

    您有几个选择:第一个是将回调传递给getAddressList,并在成功时调用回调。更有棱角的方式是使用$q service

    getAddressList: function(address) {
      var deferred = $q.defer();
    
      geocoder.geocode( { 'address': address }, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
          deferred.resolve(results);
        } else {
          deferred.reject("Couldn't find that address! Google Maps says: " + status);
        }
      });
    
      return deferred.promise;
    }
    

    控制器也需要改变:

    $scope.submit = function(addressform) {
      geocoder.getAddressList($scope.formData.address).then(function(result) {
        $scope.addresses = result;
      }, function(err) {
        alert(err);
      });
    }
    

    不要从服务发出警报调用。这是一个 UI 问题。

    【讨论】:

    • 感谢您的回复。当我开始使用 angular 时,我意识到我的第一个版本不是 angular 的做事方式,当地理编码器返回结果时,我使用 jQuery 将列表附加到 html。我认为这是这样做的方法,但是我不确定您所说的“不要从服务发出警报呼叫。这是一个 UI 问题。”,我应该从哪里拨打电话?我应该有一个某种形式的 UI 关注?谢谢
    • 这只是对您原始代码的评论。与 UI 交互的东西应该远离服务。请注意,在我修改后的代码中,我如何将alert 保留在服务之外。该服务仅返回一条消息。如何在 UI 中使用该消息(如果有的话)是控制器的问题,而不是服务的问题。
    • 啊谢谢我现在明白了。事实上,该服务确实返回了一条消息,它不担心通过警报或任何其他 UI 界面显示它,它的工作是提供地理编码结果。结果如何显示在页面上,那部分在 html 端,所以我想我做了你推荐的。再次感谢!
    猜你喜欢
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多