我正在使用 AngularUI 的uiMap指令来实例化谷歌地图。uiMap 指令适用于硬编码数据({mapOptions}
和[myMarkers]
);但是,当我通过检索此数据时遇到了麻烦$http.get()
(指令在 AJAX 调用完成之前触发)。
最初我在GoogleMaps
控制器中执行 GET,但当我意识到事情发生的顺序不正确时,我将 GET 移动到uiMap
指令中。我有两个问题:
- 我认为这不是正确的方法。
- GET 还检索数据
[myMarkers]
- 创建标记的函数/指令无处不在,因为它负责创建所有覆盖
所以我的问题是,在指令运行之前,应用程序中是否还有其他地方可以检索数据(并将其应用于范围)?
我阅读了$q,这听起来像是我想要的,但我不确定我是否可以在我的控制器中而不是在指令中做到这一点(也不确定$q.defer.resolve()
与 有什么不同$http.success()
)。
编辑我使用的大部分代码是从 AngularUI 的文档中复制/粘贴的,但这里有一个 plunk:http ://plnkr.co/edit/t2Nq57
解决方案
<!-- 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>
注意事项1 uiIf 不能位于指定控制器提供其条件的同一元素中(uiIf 的优先级高于 ngController,因此在 uiIf 执行之前不会设置其控制器)。
注意事项2请务必使用最新版本的 uiIf(最新标签 v0.3.2 中提供的版本已过时)。旧版本在某些情况下存在导致 TypeError 的错误。
警告 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 上的渲染制作器。我正在研究这个GitHub 问题/评论中建议的 uiMapMarker 的替代版本。
此问题的解决方案: https
://stackoverflow.com/a/14617167/758177工作示例: http ://plnkr.co/edit/0CMdW3?p=preview