Я использую директивы AngularUI uiMap для создания копии карты Google. Директива uiMap отлично работает с жестко кодированными данными ({mapOptions}
и [myMarkers]
); однако я столкнулся с трудностями, когда я извлекаю эти данные через $http.get()
(директива срабатывает до завершения вызова AJAX).
Изначально я выполнял GET в моем контроллере GoogleMaps
, но когда я понял, что вещи происходят из последовательности, я переместил GET в директиву uiMap
. У меня есть две проблемы:
- Я думаю, что это не правильный способ сделать это.
- GET также извлекает данные для
[myMarkers]
- Функция/директива, которая создает маркеры, является вездесущей, поскольку она отвечает за создание всех наложений
Итак, мой вопрос: есть ли где-то еще в приложении, где я могу получить данные (и применить их к области видимости) до запуска директивы?
Я прочитал $q, и такие звуки, как то, что я хочу, но я не уверен, могу ли я сделайте это в моем контроллере, а не в директиве (также не знаете, как $q.defer.resolve()
отличается от $http.success()
).
EDIT Большая часть кода, который я использую, копирует/вставляет из документа AngularUI, но здесь plunk: http://plnkr.co/edit/t2Nq57
Решение
На основе Andy answer, я использовал комбинацию uiMap и uiIf
<!-- index.html -->
<div
id="map_container"
ng-controller="GoogleMaps">
<div ui-if="mapReady">
<div
ng-repeat="marker in markers"
ui-map-marker="markers[$index]"
ui-event="{'map-click':'openMarkerInfo(marker)'}"
></div>
<div
ui-map-info-window="myInfoWindow"
ng-include="'infobox.html'"
></div>
<div
id="map_canvas"
ui-map="myMap"
ui-options="mapOptions"
></div>
</div>
</div>
Caveat 1 uiIf не может находиться в том же элементе, который указывает контроллер, снабжающий его условием (uiIf имеет более высокий приоритет, чем ngController, поэтому его контроллер не будет установлен до выполнения uiIf).
Caveat 2 Обязательно используйте самую последнюю последнюю версию uiIf (версия, представленная в последней тег, v0.3.2, устарел). У старого есть ошибка, вызывающая TypeError при определенных обстоятельствах.
Caveat 3 jQuery ДОЛЖЕН быть включен перед AngularJS (в index.html); иначе вы получите TypeError, указав, что Object [object Object] has no method 'trigger'
(или Object [object HTMLDivElement] has no method 'trigger'
в Windows). Chrome позволит вам войти в функцию триггера, потому что Chrome знает об этом, но Angular не делает (и Angular выбрасывает ошибку).
function GoogleMaps( $scope , $http )
{
var mapDefaults = {
center: new google.maps.LatLng(25,-90),//centres on Gulf of Mexico
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
$scope.mapOptions = {};
$scope.mapReady = false;
$scope.markers = [];
$http.get('map.json').then(function mapData(response) {
var map_data = response.data,
user_defaults = map_data.user.defaults; //{center: [lat,lng], zoom: 15}
$scope.mapOptions = {
"center": (typeof user_defaults.center !== 'undefined') ?
new google.maps.LatLng(user_defaults.center[0],user_defaults.center[1])
: mapDefaults.center,
"zoom": (typeof user_defaults.zoom !== 'undefined') ?
parseInt(user_defaults.zoom,10)
: mapDefaults.zoom,
"mapTypeId": mapDefaults.mapTypeId
};
//working on code to populate markers object
$scope.mapReady = true;
});
// straight from sample on http://angular-ui.github.com/#directives-map
$scope.addMarker = function($event) { … };
$scope.openMarkerInfo = function(marker) { … };
$scope.setMarkerPosition = function(marker, lat, lng) { … };
}//GoogleMaps{}
Недостаток. uiMap в настоящее время не поддерживает создателей рендеринга на domready. Я рассматриваю альтернативную версию uiMapMarker, предложенную в этом проблема/комментарий GitHub.
Решение этой проблемы: qaru.site/info/327482/...
Рабочий пример: http://plnkr.co/edit/0CMdW3?p=preview