其实我对angularjs并不陌生,并且面临着使我感到困惑的问题。
我已经编写了angularjs Controller ,它会在下拉菜单中填充数据,并选择每个选项,它应该在 map 上显示特定位置。为了触发事件,我使用了ng-change。

我的HTML View 如下所示:

<select name="DeviceList" ng-model="deviceList" ng-change="filterMarkers()">
                                        <option value="0" selected="selected">All</option>
                                        <option ng-repeat="device in data" value="{{device.id}}">{{device.name}}</option>
                                </select>

JSON对象看起来像
[{
"id": 1,
"name": "MacVend1001",
"latitude": "12.9383145",
"longitude": "77.57274628",
"status": "ON",
"failureMessage": null,
"healthIndex": [{
    "Parameter": "Voltage",
    "value": "29",
    "y-axis": [244, 124, 226, 372, 180, 290, 135, 350, 175, 145],
    "x-axis": ["2016-01-01 13:49:32", "2016-01-02 13:48:43", "2016-01-03 13:48:43", "2016-01-04 13:48:43", "2016-01-05 13:49:32", "2016-01-06 13:48:43", "2016-01-07 13:48:43", "2016-01-08 13:48:43", "2016-01-09 13:48:43", "2016-01-10 13:48:43"],
    "chart-type": "Trend"
}, {
    "Parameter": "Internal Temprature",
    "value": "30",
    "y-axis": [44, 24, 26, 72, 80, 90, 35, 50, 75, 45],
    "x-axis": ["2016-01-01 13:49:32", "2016-01-02 13:48:43", "2016-01-03 13:48:43", "2016-01-04 13:48:43", "2016-01-05 13:49:32", "2016-01-06 13:48:43", "2016-01-07 13:48:43", "2016-01-08 13:48:43", "2016-01-09 13:48:43", "2016-01-10 13:48:43"],
    "chart-type": "Trend"
}, {
    "Parameter": "External Temprature",
    "value": "45",
    "y-axis": [144, 224, 126, 372, 180, 2940, 1355, 250, 175, 345],
    "x-axis": ["2016-01-01 13:49:32", "2016-01-02 13:48:43", "2016-01-03 13:48:43", "2016-01-04 13:48:43", "2016-01-05 13:49:32", "2016-01-06 13:48:43", "2016-01-07 13:48:43", "2016-01-08 13:48:43", "2016-01-09 13:48:43", "2016-01-10 13:48:43"],
    "chart-type": "Trend"
}]

}]

最后 Controller 在这里
angular.module('mapsApp', [])
.controller('NewMapCtrl', function ($scope,$http) {
    $scope.data=[];
    $http({method:'GET',url: 'https://korbsbvm130.apac.bosch.com:8244/intelrfc/1.0/devicelist'}).success(function(API_RESPONSE){
        $scope.data=API_RESPONSE;
        $scope.devicelist=0;
    });

    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,
            Name:info.name
        });
        marker.content = '<div class="infoWindowContent">' + info.desc + '</div><div class="infoWindowContent">' + info.city + '</div><div class="infoWindowContent">' + info.name + '</div>';

        google.maps.event.addListener(marker, 'click', function () {
            infoWindow.setContent('<h2>' + marker.Name +'<h2>' + marker.title + '</h2>' + marker.content);
            infoWindow.open($scope.map, marker);
        });
        $scope.markers.push(marker);
    }

  for (i = 0; i < $scope.data.length; i++) {
        createMarker($scope.data[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 devicesData;
       var deviceName = $scope.deviceList;
       if(deviceName == '0') {
          devicesData = $scope.data;
       }
       else {
          devicesData = $scope.data.filter(function(c){
              alert("C.id="+c.id)
            if(c.id == deviceName)
               return c;
          });
       }
       //2.update markers on map
       $scope.clearMarkers();
       for (i = 0; i < devicesData.length; i++) {
        createMarker(devicesData[i]);
       }
    }

});

现在的问题是,无论何时我从填充的下拉菜单中单击任何选项,它都会两次调用filtermarkers()函数,但通常不会。请分享您的想法,以摆脱它。

它还在填充的下拉列表中显示了两个空选项。

javascript - AngularJS:函数在ng-change上触发两次,同时从下拉列表中选择任何选项-LMLPHP

最佳答案

您可能只是没有正确配置select指令。.我不记得在select指令中看到value属性。.这是一个显示简单用法的插件,配置为在选择更改时调用函数。

https://plnkr.co/edit/zOZ9Tqv4r5rYPXTNyICx?p=preview

标记:

  <body ng-app="myApp">
    <div ng-controller="myController">
      <select ng-model="selectedOption" ng-change="someFunction()">
        <option ng-repeat="device in someArray">{{device.name}}</option>
      </select>
    </div>
  </body

希望这可以帮助。

07-26 08:14
查看更多