Поэтому я пытаюсь использовать углы и иметь некоторые проблемы, пытаясь вызвать директиву (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
}
Я думаю, что я могу просто сделать это совершенно неправильно, не имея вообще никакой удачи в директивном звонке. Я пытаюсь обновить свою карту на основе местоположения, которое я нажимаю, и вытаскивать информацию из этого конкретного места с места. Любая помощь будет большой.
У меня почти такая же работа, и я решил ее с помощью Службы, которая получает 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>