0

Итак, я пытаюсь использовать углы и иметь некоторые проблемы, пытаясь вызвать директиву (google maps https://github.com/davidepedone/angular-google-places-map) и выполнять обратное геокодирование. Я думаю, что это были бы более общие вопросы директив.Методы вызова из директивы

Я пытаюсь вызвать функцию в директиве, чтобы обновить информацию о местоположении карты Google, а также карту. То, как я размышляю в своей голове, заключается в том, что мне нужно передать переменную через контроллер, обладать этой переменной директивой, а затем директива будет запускать эту функцию?

ОБНОВЛЕНО:

<div class="row"> 
<places-map selectedid="selectid(place.id)"></places-map> 
</div> 
<button ng-click="selectid(place.id)">{{place.id}}</button> </div> 

С этой мыши я полагаю, чтобы перейти к контроллеру,

$scope.selectid= function (pickplaceid){ 
    $scope.selectedid(pickplaceid); 
} 

Тогда selectplaceid должно быть в области видимости переменных директивы.

 scope: { 
      customCallback: '&?', 
      picked: '=?', 
      address: '=?', 
      fallback: '=?', 
      mapType: '@?', 
      readonly: '@?', 
      responsive: '@?', 
      draggable: '@?', 
      toggleMapDraggable: '=?', 
      placeNotFound: '=?', 
      updateMarkerLabel: '=?', 
      selectedid:'=' 
     }, 

и может назвать свой метод, как так:

link: function ($scope, element, attrs, controller) { 
//everything else from angular-google-places 

      $scope.selectedid= function (selectedplace) 
      { 
///Whatever I want to do to geocode with the placeid 
      } 

Я думаю, что не может просто делать это совершенно неправильно, имеющий действительно не повезло с вызовом директивы вообще. Я пытаюсь обновить свою карту на основе местоположения, которое я нажимаю, и вытаскивать информацию из этого конкретного места с места. Любая помощь будет большой.

+0

Вы создаете изолированную область в вашей директиве, так он не имеет понятия о переменных в контроллере. Вам нужно передать переменные, которые вам нужны в html: cYrixmorten

+0

Разве это не означает, что ваша область действия selectplaceid = place.id? Как он будет вызывать функцию selectplaceid? –

+0

Собственно, после повторного чтения вашего вопроса я мог бы подумать, что вы можете изменить '$ scope.selectplaceid = pickplaceid;' в '$ scope.selectplaceid (pickplaceid);' в вашем контроллере вызвать метод внутри вашей директивы. Однако вам все равно нужно передать функцию в вашу директиву в HTML, поскольку вы создали изолированную область. Взгляните на пример передачи customerInfo в документации: https://docs.angularjs.org/guide/directive – cYrixmorten

ответ

0

У меня почти то же самое работает, и я решил его с Сервисом, который получает placeId (в моем коде он называется addressId, но это место, которое Google Maps ожидает). В моей службе, я использую placeId получить адресные данные:

app.service('AddressDetailsService', ['$q', function ($q) { 

    this.placeService = new google.maps.places.PlacesService(document.getElementById('map')); 

    this.getDetails = function (addressId, address) { 
     var deferred = $q.defer(); 

     var request = { 
     placeId: addressId 
     }; 

     this.placeService.getDetails(request, function (place, status) { 
     if (status === google.maps.places.PlacesServiceStatus.OK) { 
      address.placeId = addressId; 
      address.street = getAddressComponent(place, 'route', 'long'); 
      address.countryCode = getAddressComponent(place, 'country', 'short'); 
      address.countryName = getAddressComponent(place, 'country', 'long'); 
      address.cityCode = getAddressComponent(place, 'locality', 'short'); 
      address.cityName = getAddressComponent(place, 'locality', 'long'); 
      address.postalCode = getAddressComponent(place, 'postal_code', 'short'); 
      address.streetNumber = getAddressComponent(place, 'street_number', 'short'); 
      address.latitude = place.geometry.location.lat(); 
      address.longitude = place.geometry.location.lng(); 

      if (address.streetNumber) { 
      address.streetNumber = parseInt(address.streetNumber); 
      } 
      deferred.resolve(address); 
     } 
     }); 

     return deferred.promise; 
    }; 

    function getAddressComponent(address, component, type) { 
     var country = null; 
     angular.forEach(address.address_components, function (addressComponent) { 
     if (addressComponent.types[0] === component) { 
      country = (type === 'short') ? addressComponent.short_name : addressComponent.long_name; 
     } 
     }); 

     return country; 
    } 
    }]); 

Затем вводят его и вызвать службу из вашей директивы. Это тот, который я использую, вам может понадобиться его адаптировать, но вы видите эту идею. Вместо функции связи, я использую контроллер для директивы:

.directive('mdAddressDetails', function mdAddressDetails() { 
    var directive = { 
     restrict: 'EA', 
     scope: { 
     address: '=' 
     }, 
     bindToController: true, 
     templateUrl: 'modules/address/addressDetails.html', 
     controller: AddressDetailsController, 
     controllerAs: 'dir' 
    }; 

    AddressDetailsController.$inject = ['AddressDetailsService', '$q']; 

    function AddressDetailsController(AddressDetailsService, $q) { 
     var dir = this; 

     dir.selectAddress = selectAddress; 

     function selectAddress(address) { 
     if ((address) && (address.place_id)) { 
      AddressDetailsService.getDetails(address.place_id, dir.address).then(
      function (addressDetails) { 
       dir.address = addressDetails; 
      } 
     ); 
     } 
     } 
    } 

    return directive; 
    }); 

И тогда вы просто вызовите директиву с разыскиваемым параметром:

<md-address-details address="myAddress"></md-address-details> 
+0

интересно взять на себя управление контроллером, а не связать его. Поскольку у меня уже есть директива Я смущен тем, как ваш ng-click будет ссылаться на директиву? –

+0

Извините! Пропустил эту часть. Я предполагаю, что это будет примерно так: http://stackoverflow.com/questions/15613992/ng-click-attribute-on-angularjs-directive, так что у вас действительно есть ng-click внутри вашей директивы и обрабатывайте его там. – LeoLozes

+0

Итак, я немного смущен, как это делается с помощью директивы map-map? Поскольку моя директива является автозаполнением с Картами Google, и у меня есть ng-click отдельно от директивы, я смущен, как это работает? То, что я вижу здесь, заключается в том, что ваша директива будет вызывать службу, которая будет извлекать данные карт. –

Смежные вопросы