Javascript 基于下拉菜单中的用户选择在Google地图中显示多边形线的动画
我已经创建了一个应用程序,用于在google maps中设置多边形线的动画,一旦我们从下拉列表中选择特定用户,动画就会开始,该应用程序工作正常,但问题是,一旦某个特定的动画启动并继续,如果我们选择另一个用户,则应用程序将被挂起并显示意外的动画 任何人都可以告诉我一些解决方案,一旦选择了另一个用户并需要在这之后显示所选用户的多边形动画,就可以在这两者之间打断动画Javascript 基于下拉菜单中的用户选择在Google地图中显示多边形线的动画,javascript,angularjs,google-maps,google-maps-api-3,google-polyline,Javascript,Angularjs,Google Maps,Google Maps Api 3,Google Polyline,我已经创建了一个应用程序,用于在google maps中设置多边形线的动画,一旦我们从下拉列表中选择特定用户,动画就会开始,该应用程序工作正常,但问题是,一旦某个特定的动画启动并继续,如果我们选择另一个用户,则应用程序将被挂起并显示意外的动画 任何人都可以告诉我一些解决方案,一旦选择了另一个用户并需要在这之后显示所选用户的多边形动画,就可以在这两者之间打断动画 <html lang="en"> <head> <script data-require=
<html lang="en">
<head>
<script data-require="lodash.js@2.4.1" data-semver="2.4.1" src="http://cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.js"></script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script type="text/javascript" src="https://code.angularjs.org/1.2.16/angular.js"></script>
<script type="text/javascript" src="script.js"></script>
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&libraries=panoramio"></script>
</head>
<body ng-app="app" ng-controller="Controller">
<select ng-change="showGPSTracking()" ng-model="user">
<option selected="selected" value="" class="">Select User</option>
<option value="1458">1458</option>
<option value="1658">1658</option>
</select>
</br></br></br></br>
<div style="width: 880px;">
<div id="map" style="width: 880px; height: 500px; float: left;"></div>
</div>
</body>
</html>
选择用户
1458
1658
您遇到的问题是您只有一个全局map
变量。每次更改用户时,都会更新该映射并创建数百个函数调用。因此,第一个映射上的函数调用开始与第二个映射上的函数调用冲突——它们都在同一个映射对象上工作
我在这里的快速而肮脏的修复方法只是将map对象设置为局部变量,并将其传递到autoRefresh
函数中。对第一个映射上的函数的调用仍将发生,只是结果将不可见,因为在将映射div重新分配给新映射时,实际上已经隐藏了该映射
我认为这并不理想,但对我来说似乎很管用。理想情况下,您可以通过某种方式“停止”其中一个贴图上的动画,并防止执行添加到路由的所有函数
var app = angular.module('app', []);
app.controller("Controller", function($scope, $http, item) {
$scope.tracker = {};
var items;
$scope.showLiveMap = false;
$scope.showLiveMap = false;
var firtslat, firstlong;
var icon = new google.maps.MarkerImage("http://maps.google.com/mapfiles/ms/micons/blue.png");
var center = null;
//var map = null; - you don't need this any more
var currentPopup;
var bounds = new google.maps.LatLngBounds();
var markLAT, markLNG, trackId;
var marker;
function moveMarker(map, marker, lat, lon) {
try {
marker.setPosition(new google.maps.LatLng(lat, lon));
map.panTo(new google.maps.LatLng(lat, lon));
} catch (e) {}
}
$scope.autoRefresh = function(map) {
try {
var route = new google.maps.Polyline({
path: [],
geodesic : true,
strokeColor: '#FF0000',
strokeOpacity: 1.0,
strokeWeight: 2,
editable: false,
map:map
}),
index=0,
marker=new google.maps.Marker({map:map,icon:icon});
if (!_.isEmpty(items)) {
angular.forEach(items, function(cordinates) {
setTimeout(function ()
{
route.getPath().push(new google.maps.LatLng(cordinates.lat, cordinates.lng));
// route.setMap(map); not necessary, you set the map when you created the route
moveMarker(map, marker, cordinates.lat, cordinates.lng);
markLAT = cordinates.lat;
markLNG = cordinates.lng;
}, 200*++index);
});
}
//
} catch (e) {
console.log(e);
}
};
function initMap(user)
{
items = item.items[user];
try {
markLAT = items[items.length - 1].lat;
markLNG = items[items.length - 1].lng;
var map = new google.maps.Map(document.getElementById("map"), {
center: new google.maps.LatLng(markLAT, markLNG),
zoom: 10,
mapTypeId: google.maps.MapTypeId.ROADMAP,
mapTypeControlOptions: {
style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
},
navigationControl: true,
navigationControlOptions: {
style: google.maps.NavigationControlStyle.SMALL
}
});
$scope.autoRefresh(map); // passed the local map variable into the function
} catch (e) {
console.log(e);
}
}
$scope.showGPSTracking = function() {
if (!_.isNull($scope.user)) {
initMap($scope.user);
} else {
console.log("entered");
$scope.showLiveMap = false;
}
};
});
你的Plunkr url现在似乎对我来说已经过时了。。。这可能是暂时的,但最好还是将javascript添加到question@duncan我的plunker有什么问题吗,因为我的问题中包含了js…你可以在我的plunker中看到