【问题标题】:How to filter ui-gmap-markers with select tag如何使用选择标签过滤 ui-gmap-markers
【发布时间】:2016-11-28 01:47:57
【问题描述】:

到目前为止,我必须在我的网站上显示带有标记的地图,这些标记取决于 JSON 文件中指定的不同对象的纬度和经度。这些标记可以通过选择标签进行过滤,该标签显示在这些 JSON 对象中找到的不同类别。

我一直在使用 ui-gmap-marker (ng-repeat),但在这里我发现我最好使用 ui-gmap-markers。事情是我一直在尝试实现它,但我无法应用我在选择标签中得到的过滤器(模型中的过滤器=“”给出很多错误!)此外,infoWindows 不显示信息我得到了 JSON 文件(我之前通过 ng-repeat 得到的)。

我一直在尝试从这里工作:http://embed.plnkr.co/f2gxG7DM1U8IlOXfRiuT/

<div ng-controller="loadMapController">
    <select id="dropdown" ng-model="categoryOrder">
        <option value="0">All</option>
        <option ng-repeat="category in categories" value="{{category}}">{{category}}</option>
    </select>

    <ui-gmap-google-map center='map.center' zoom='map.zoom' aria-label="Google map" pan="true">

        <ui-gmap-markers models="map.markers" idKey="'id'" coords="'self'" events="map.markersEvents">
            <ui-gmap-window show="map.window.show" coords="map.window.model" ng-cloak>
                <div>
                    <p><img ng-src="{{image}}" alt="{{name}}" style="width: 200px; height: 150px; border-radius: 5px;"></p>
                    <p><strong>{{name}}</strong></p>
                    <p>{{address}}</p>
                    <p><a ng-href="{{website}}">Website</a></p>
                    <p><span class="glyphicon glyphicon-plus"> </span><a href="#/"> Profile</a></p>
                </div>
            </ui-gmap-window>
        </ui-gmap-markers>

    </ui-gmap-google-map>

    <ul>
        <li ng-repeat="location in locations | filter:categoryOrder" ng-class="{selected: location == map.window.model}" ng-click="map.window.model = location">
            <p>{{location.name}}</p>
        </li>
    </ul>   
</div>




.controller('loadMapController', ['$scope', '$http', function($scope, $http){

    $http.get ("json/map_data.json").success(function(data) {
        $scope.locations = data;

        var category = [];

        for (var i = 0; i < data.length; i++){
            category[i] = data[i].category;
        };

        var sorted_categories = category.sort();

        $scope.categories = [];

        for (var i = 0; i < category.length; i++){
            if (sorted_categories[i+1] != sorted_categories[i]){
                $scope.categories.push(sorted_categories[i]);
            }
        };

        $scope.map.markers = data;

        console.log($scope.map.markers);

    })

    $scope.map = { 
        center: { 
            latitude: 37.395400, 
            longitude: -5.984930 
        }, 
        zoom: 12, 
        window: {
            model: {},
            show: false,
            options:{
                pixelOffset: {width:-1,height:-20}
            }
        }, 
        markers: [],
        markersEvents: {
            click: function(marker, eventName, model, args) {
                $scope.map.window.model = model;
                $scope.map.window.show = true;      
            }
        }
    };
}]);

【问题讨论】:

  • 我正在尝试的另一种选择是基于:&lt;ui-gmap-marker ng-repeat="marker in locations | filter:categoryOrder" coords="{latitude: marker.latitude, longitude: marker.longitude}" options="marker.options" events="map.markersEvents" idkey="marker.id" &gt; &lt;ui-gmap-window&gt; &lt;div&gt; &lt;p&gt;&lt;img ng-src="{{marker.image}}" alt="{{marker.name}}" &lt;/p&gt; &lt;p&gt;&lt;strong&gt;{{marker.name}}&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;{{marker.address}}&lt;/p&gt; &lt;p&gt;&lt;a ng-href="{{marker.website}}"&gt;Website&lt;/a&gt;&lt;/p&gt; &lt;/div&gt; &lt;/ui-gmap-window&gt; &lt;/ui-gmap-marker&gt; 使用 ng-click,例如 ng-click="map.window.model = location"。

标签: javascript angularjs google-maps google-maps-markers angular-google-maps


【解决方案1】:

关于过滤标记,您可以考虑以下解决方案。

一旦类别通过ngChange 发生变化,就会引入事件以根据所选类别过滤标记:

<select id="dropdown" ng-model="categoryOrder" ng-change="changeCategory(categoryOrder)">
    <option value="All">All</option>
    <option ng-repeat="category in categories" value="{{category}}">{{category}}</option>
</select>


$scope.changeCategory = function (selectedCat) {
        if (selectedCat == "All")
            $scope.map.markers = $scope.map.allMarkers;
        else
            $scope.map.markers = $scope.map.allMarkers.filter(function (item) {
                return item.category == selectedCat;
            });
    }

其中allMarkers 包含所有可用的标记

$scope.map.allMarkers = data;

示例

angular.module('app', ['uiGmapgoogle-maps'])
    .controller('loadMapController', ['$scope', '$http', function ($scope, $http, uiGmapGoogleMapApi) {

        $scope.changeCategory = function (selectedCat) {
            if (selectedCat == "All")
                $scope.map.markers = $scope.map.allMarkers;
            else
                $scope.map.markers = $scope.map.allMarkers.filter(function (item) {
                    return item.category == selectedCat;
                });
        }

        $http.get("https://rawgit.com/vgrem/b3a820dcdf3c7b14fba6e53614a951b4/raw/map_data.json").success(function (data) {
            $scope.locations = data;

            var category = [];

            for (var i = 0; i < data.length; i++) {
                category[i] = data[i].category;
            };

            var sorted_categories = category.sort();

            $scope.categories = [];

            for (var i = 0; i < category.length; i++) {
                if (sorted_categories[i + 1] != sorted_categories[i]) {
                    $scope.categories.push(sorted_categories[i]);
                }
            };

            $scope.map.markers = data;
            $scope.map.allMarkers = data;
        });

        $scope.map = {
            center: {
                latitude: 36.2509994,
                longitude: -113.6920185
            },
            zoom: 3,
            window: {
                model: {},
                show: false,
                options: {
                    pixelOffset: { width: -1, height: -20 }
                }
            },
            markers: [],
            markersEvents: {
                click: function (marker, eventName, model, args) {
                    $scope.map.window.model = model;
                    $scope.map.window.show = true;
                }
            }
        };
    }]);
.angular-google-map-container {
	height: 30em;
}
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular.min.js" charset="utf-8"></script>
  <script src="http://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.5.0/lodash.js" charset="utf-8"></script>
  <script src="http://cdnjs.cloudflare.com/ajax/libs/angular-google-maps/2.1.0-X.5/angular-google-maps.js" charset="utf-8"></script>
  


  <div ng-app="app" ng-controller="loadMapController">
    <select id="dropdown" ng-model="categoryOrder" ng-change="changeCategory(categoryOrder)">
        <option value="All">All</option>
        <option ng-repeat="category in categories" value="{{category}}">{{category}}</option>
    </select>

    <ui-gmap-google-map center='map.center' zoom='map.zoom' aria-label="Google map" pan="true">

        <ui-gmap-markers models="map.markers" idKey="'id'" coords="'self'" events="map.markersEvents">
        </ui-gmap-markers>

        <ui-gmap-window show="map.window.show" coords="map.window.model" ng-cloak>
                <div>
                    <p><img ng-src="{{map.window.model.image}}" alt="{{map.window.model.name}}" style="width: 200px; height: 150px; border-radius: 5px;"></p>
                    <p><strong>{{map.window.model.name}}</strong></p>
                    <p>{{map.window.model.address}}</p>
                    <p><a ng-href="{{map.window.model.website}}">Website</a></p>
                    <p><span class="glyphicon glyphicon-plus"> </span><a href="#/"> Profile</a></p>
                </div>
        </ui-gmap-window>

    </ui-gmap-google-map>

    <ul>
        <li ng-repeat="location in locations | filter:categoryOrder" ng-class="{selected: location == map.window.model}" ng-click="map.window.model = location">
            <p>{{location.name}}</p>
        </li>
    </ul>   

   
</div>

Plunker

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多