简体   繁体   English

Google Maps类别过滤器不起作用-AngularJS

[英]Google-Maps Category Filter not Working - AngularJS

I have a list of cities and some or their features shown in the code below (id, city, description, latitude, longitude and icon). 我在下面的代码(id,城市,描述,纬度,经度和图标)中显示了城市及其部分列表。

I would like to filter by description as show in the examples below: 我想按描述进行过滤,如下例所示:

  • If select 'World This city is live' is selected, dropdown list map should 如果选择“世界这个城市是活的”,则下拉列表地图应
    display: Toronto, Los Angeles and Las Vegas ; 显示: 多伦多,洛杉矶和拉斯维加斯

  • If 'coastal area' gets selected, dropdown list map should display: New York and Los Angeles ; 如果选择了“沿海地区”,则下拉列表地图应显示: 纽约和洛杉矶

  • If 'incredible city' gets selected, dropdown list map should display: Los Angeles . 如果选择了“不可思议的城市”,则下拉列表地图应显示: Los Angeles

My Angularjs code: 我的Angularjs代码:

  angular.module('mapsApp', []) .controller('MapCtrl', ['$scope', '$http', '$location', '$window', '$compile', function($scope, $http, $location, $window, $compile) { var cities = [{ id: '02jdjd', city: 'Toronto', desc: 'World Largest city,This city is live,This is the second best city in the world', lat: 43.7000, long: -79.4000, icon:'http://labs.google.com/ridefinder/images/mm_20_purple.png' }, { id: '02jdjdsss', city: 'New York', desc: 'coastal area,This city is aiiiiite, ', lat: 40.6700, long: -73.9400, icon:'http://labs.google.com/ridefinder/images/mm_20_red.png' }, { id: '02jdjdsssws', city: 'Chicago', desc: 'This is the second best city in the world', lat: 41.8819, long: -87.6278, icon:'http://labs.google.com/ridefinder/images/mm_20_green.png' }, { id: '02jdjdsssz', city: 'Los Angeles', desc: 'This city is live,coastal area,incredible city', lat: 34.0500, long: -118.2500, icon:'http://labs.google.com/ridefinder/images/mm_20_blue.png' }, { id: '02jdjdssq', city: 'Las Vegas', desc: 'the most populous city,This city is live,This city is aiiiiite', lat: 36.0800, long: -115.1522, icon:'http://labs.google.com/ridefinder/images/mm_20_yellow.png' }]; var mapOptions = { zoom: 4, center: new google.maps.LatLng(40.0000, -98.0000), mapTypeId: google.maps.MapTypeId.TERRAIN } $scope.map = new google.maps.Map(document.getElementById('map'), mapOptions); $scope.markers = []; var infoWindow = new google.maps.InfoWindow(); var createMarker = function(info) { var marker = new google.maps.Marker({ map: $scope.map, position: new google.maps.LatLng(info.lat, info.long), title: info.city, icon: info.icon }); marker.content = '<div><h2>'+marker.title+'</h2><input type="button" value="get" ng-click="get(\\'' + info.id + '\\')"/>' + '<div class="infoWindowContent">' + info.desc + '</div><div class="infoWindowContent">' + info.city + '</div></div>'; // marker.content = "<div><h2>" + marker.title + "</h2><input type='button' value='get' ng-click='get(" + info.id + ")'/>" + "<div class='infoWindowContent'>" + info.desc + "</div><div class='infoWindowContent'>" + info.city + "</div></div>"; google.maps.event.addListener( marker, 'click', (function(marker, $scope) { return function() { var compiled = $compile(marker.content)($scope); $scope.$apply(); infoWindow.setContent(compiled[0]); infoWindow.open($scope.map, marker); }; })(marker, $scope) ); $scope.markers.push(marker); } $scope.get = function(city) { console.log(city); //alert("from $scope.get id : "+id); } for (i = 0; i < cities.length; i++) { createMarker(cities[i]); } $scope.openInfoWindow = function(e, selectedMarker) { e.preventDefault(); google.maps.event.trigger(selectedMarker, 'click'); } $scope.clearMarkers = function() { for (var i = 0; i < $scope.markers.length; i++) { $scope.markers[i].setMap(null); } $scope.markers.length = 0; } $scope.filterMarkers = function() { //1.select filtered cities var filteredCities; var cityDesc = $scope.data.singleSelect; if (cityDesc == '0') { filteredCities = cities; } else { filteredCities = cities.filter(function(c) { if (c.desc == cityDesc) return c; }); } //2.update markers on map $scope.clearMarkers(); for (i = 0; i < filteredCities.length; i++) { createMarker(filteredCities[i]); } } }]); **My CSS code:** 
 #map { height: 420px; width: 600px; } .infoWindowContent { font-size: 14px !important; border-top: 1px solid #ccc; padding-top: 10px; } h2 { margin-bottom: 0; margin-top: 0; } **My HTML code:** 
  <script src="https://maps.googleapis.com/maps/api/js"></script> <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script> <div ng-app="mapsApp" ng-controller="MapCtrl"> <div id="map"></div> <br> <br> <label>Filter Marker </label> <br> <select name="singleSelect" ng-model="data.singleSelect" ng-change="filterMarkers()"> <option value="0">all</option> <option value="This is the best city in the world">This is the best city in the world</option> <option value="This city is aiiiiite">This city is aiiiiite</option> <option value="the most populous city">the most populous city</option> <option value="This city is live">This city is live</option> <option value="coastal area">coastal area</option> <option value="World Largest city">World Largest city</option> <option value="incredible city">incredible city</option> </select> <br> <div id="class" ng-repeat="marker in markers | orderBy : 'title'"> <a href="#" ng-click="openInfoWindow($event, marker)">{{marker.title}}</a> </div> </div> 

Have you any idea on why it isn't working? 您知道为什么它不起作用吗? Any suggestions? 有什么建议么? Thanks in advance. 提前致谢。

Filtering does not behave as expected since in the current implementation of filterMarkers function the precise filter is used: 过滤的行为不符合预期,因为在当前的filterMarkers函数实现中, filterMarkers精确的过滤器:

filteredCities = cities.filter(function(c) {
   if (c.desc == cityDesc)
       return c;
});

Replace filterMarkers function with: filterMarkers函数替换为:

$scope.filterMarkers = function() {
    //1.select filtered cities
    var filteredCities;
    var cityDesc = $scope.data.singleSelect;
    if (cityDesc == '0') {
        filteredCities = cities;
    } else {
        filteredCities = cities.filter(function(c) {
           if (c.desc.indexOf(cityDesc) > -1) //
                        return c;
           });
        }
        //2.update markers on map
        $scope.clearMarkers();
        for (i = 0; i < filteredCities.length; i++) {
                createMarker(filteredCities[i]);
        }
   } 

that returns any cities those desc property contains selected option value. 返回那些desc属性包含选定选项值的城市。

Modified example 修改示例

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM