AngularJS Изменение DropDown в соответствии со значениями DropDown для фильтров ng-repeat

У меня есть список из 1400 мест по всему миру, и я отображаю их с помощью ng-repeat. Я хочу иметь раскрывающиеся списки, чтобы сузить список с помощью функции фильтра, чтобы я мог видеть только местоположения в регионе: Америка, страна: Канада, например. Я заставил раскрывающиеся фильтры работать правильно, но моя проблема заключается в изменении значений раскрывающихся списков. Если я выберу параметр «Регион» в первом раскрывающемся списке, в раскрывающемся списке стран должны быть только страны этого региона.

Вот мой шаблон:

Region:<select ng-model='RegionLocation.Region' ng-options="location.Region for location in RegionOptions.Regions"></select>
Country:<select ng-model='CountryLocation.Country' ng-options="location.Country for location in CountryOptions.Countries"></select>
<div>
    <md-card data-ng-repeat="location in LocationCtrl.Locationlist | filter:RegionFilter | filter:CountryFilter ">
        <md-card-content>
            <h2>{{::location.LID}}</h2>
        </md-card-content>
    </md-card>
</div>

Вот мой Controller.js

function LocationController(LocationList, $scope) {
    var LocationCtrl = this;

    LocationCtrl.Locationlist = LocationList;

    LocationCtrl.Regions = filterRegions(LocationList);
    LocationCtrl.Regions.unshift({
        Region: 'Show All'
    })
    $scope.RegionOptions = {
        Regions:LocationCtrl.Regions,
    }
    $scope.RegionLocation = {
        Region: $scope.RegionOptions.Regions[0],
    }
    $scope.CountryOptions = {
        Countries:getCountries()
    };
    $scope.CountryLocation = {
        Country: $scope.CountryOptions.Countries[0]
    };
    $scope.RegionFilter = function (data) {
        if($scope.RegionLocation.Region.Region == 'Show All'){
            return true;
        } else if(data.Region == $scope.RegionLocation.Region.Region){
            return true;
        } else{
            return false;
        }
    };
    $scope.CountryFilter = function (data) {
        if($scope.CountryLocation.Country.Country == 'Show All'){
            return true;
        } else if(data.Country == $scope.CountryLocation.Country.Country){
            return true;
        } else{
            return false;
        }
    };
    function getCountries(){
        LocationCtrl.Countries = filterCountries(LocationList);
        LocationCtrl.Countries.unshift({
            Country: 'Show All'
        });
        return LocationCtrl.Countries;
    };
    function filterRegions(arr) {
      var f = []
      return arr.filter(function(n) {
        return f.indexOf(n.Region) == -1 && f.push(n.Region)
      })
    };
    function filterCountries(arr){
        var f = [];
        return arr.filter(function(n) {
            return f.indexOf(n.Country) == -1 && f.push(n.Country)
        })
    };

}

Я также понимаю, что мой код не очень чистый и не простой, поэтому предложения по его упрощению более чем приветствуются.

Спасибо!!


person Wish I Knew this stuff    schedule 03.08.2017    source источник
comment
Можете ли вы показать данные LocationList? Может быть лучший и эффективный способ решить вашу проблему (путем поиска внутри объекта) даже без написания этих функций фильтра.   -  person Shantanu    schedule 03.08.2017
comment
Вот пример 2 объектов в списке. но опять же в списке около 1400. @Шантану [{"LID":"AB02","City":"Calgary","State":"Alberta","Country":"Canada","Region":"Americas","Latitude"XXXXXX"Longitude"XXXXX},{"LID":"AB08","City":"Canmore","State":"Alberta","Country":"Canada","Region":"Americas","Latitude":XXXXXX,"Longitude":XXXXXXX},   -  person Wish I Knew this stuff    schedule 03.08.2017


Ответы (2)


Вы были на правильном пути с использованием фильтра в ng-repeat, вот как мне удалось заставить его работать на основе некоторых фиктивных данных. Это очень просто сделать с помощью фильтра. Надеюсь, это поможет.

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope, $filter) {
  $scope.name = 'Sup World';

  $scope.list = [{
    "LID": "AB02",
    "City": "Calgary",
    "State": "Alberta",
    "Country": "Canada",
    "Region": "Americas",
    "Latitude": "XXXXXX",
    "Longitude": "XXXXX"
  }, {
    "LID": "AB08",
    "City": "Canmore",
    "State": "Alberta",
    "Country": "Canada",
    "Region": "Americas",
    "Latitude": "XXXXXX",
    "Longitude": "XXXXXXX"
  }, {
    "LID": "AB09",
    "City": "Cape Town",
    "State": "Western Cape",
    "Country": "South Africa",
    "Region": "Africa",
    "Latitude": "XXXXXX",
    "Longitude": "XXXXXXX"
  }, {
    "LID": "AB12",
    "City": "Eish",
    "State": "Somewhere",
    "Country": "Zimbabwe",
    "Region": "Africa",
    "Latitude": "XXXXXX",
    "Longitude": "XXXXX"
  }, {
    "LID": "AB18",
    "City": "Lusaka",
    "State": "Zambia?",
    "Country": "Zambia",
    "Region": "Africa",
    "Latitude": "XXXXXX",
    "Longitude": "XXXXXXX"
  }, {
    "LID": "AB19",
    "City": "Durban",
    "State": "Kwazulu Natal",
    "Country": "South Africa",
    "Region": "Africa",
    "Latitude": "XXXXXX",
    "Longitude": "XXXXXXX"
  }, {
    "LID": "AB13",
    "City": "Pretoria",
    "State": "JoJo",
    "Country": "South Africa",
    "Region": "Africa",
    "Latitude": "XXXXXX",
    "Longitude": "XXXXXXX"
  }];

  $scope.region = [];
  //get unique regions
  $scope.regions = $filter('unique')($scope.list, "Region");

  $scope.country = [];
  //get unique countries
  $scope.countries = $filter('unique')($scope.list, "Country");

});

app.filter('unique', function() {
  return function(arr, field) {
    var o = {},
      i, l = arr.length,
      r = [];
    for (i = 0; i < l; i += 1) {
      o[arr[i][field]] = arr[i];
    }
    for (i in o) {
      r.push(o[i]);
    }
    return r;
  };
})
<!DOCTYPE html>
<html ng-app="plunker">

<head>
  <meta charset="utf-8" />
  <title>AngularJS Plunker</title>
  <script>
    document.write('<base href="' + document.location + '" />');
  </script>
  <link rel="stylesheet" href="style.css" />
  <script data-require="[email protected]" src="https://code.angularjs.org/1.4.12/angular.js" data-semver="1.4.9"></script>
  <script src="app.js"></script>
</head>

<body ng-controller="MainCtrl">
  Region:
  <select ng-model='region' ng-options="location.Region for location in regions"></select> 
Country: 
<select ng-model='country' ng-options="location.Country for location in countries | filter:{'Region': region.Region }"></select>
  <div>
    <md-card data-ng-repeat="location in list | filter:{'Region':region.Region,'Country':country.Country} ">
      <md-card-content>
        <h2>{{::location.LID}}</h2>
      </md-card-content>
    </md-card>
  </div>
</body>

</html>

person Leevashan    schedule 03.08.2017

См. этот Plunker, мне пришлось изменить значения страны и региона, чтобы различать их, поскольку значения одинаковы в обоих объектах.

person Praveen    schedule 03.08.2017