Angular JS 过滤器 ng-repeat with field AND dropdown

Angular JS filter ng-repeat with field AND dropdown

我在网上看到了很多关于这个问题的相互矛盾的答案,但我正在寻找最简洁的方法来完成这个。

我的数据是世界各国的列表,包括名称、ISO alpha 代码、世界区域等。

我在 table 中有一个 ng-repeat 来显示这个:

<tr ng-repeat="i in filteredItems = (iso3166 | filter: countryFilter)">

我有一个文本字段和一个需要过滤列表的下拉菜单。

文本字段应该按国家/地区名称过滤:通过匹配 ISO alpha 代码或国家/地区名称。

<input type="text" id="countrySearch" placeholder="Country" ng-model="countryQuery">

这在控制器中适用于此:

    $scope.countryFilter = function (value) {
      if (angular.isUndefined($scope.countryQuery) || $scope.countryQuery === '') {
        return true;
      }
       return value.name.indexOf($scope.countryQuery) >= 0 || value.alpha_2.indexOf($scope.countryQuery) >= 0;
    };

我存在的祸根是如何将下拉菜单融入其中。下拉菜单使用了一个对象数组,其中包含世界区域的值,如

$scope.regionMenu = [
    {
      label: 'Show All',
      value: ''
    },
    {
      label: 'EU',
      value: 'Europe'
    },...

<select ng-model="region" ng-options="s.value as s.label for s in regionMenu"></select>

目标是让输入字段协同工作,因此如果输入的值匹配,filteredItems 将显示一行:

(ISO alpha-2 或名称)AND(在菜单中选择的区域)

任何有关如何编辑 countryFilter 函数或完全重写它以完成此功能的帮助都非常感谢。

我能想到两个方案:

解决方案 1:链接另一个过滤器

这个解决方案更简单,但效率较低,因为您最终可能会扫描数组中的所有元素两次(而不是解决方案 2 中的一次).

控制器:

$scope.regionFilter = function (value) {
  if (angular.isUndefined($scope.region) || $scope.region === '') {
    return true;
  }
  return value.region === $scope.region;
};

模板:

<tr ng-repeat="i in filteredItems = (iso3166 | filter: countryFilter | filter: regionFilter)">

解决方案 2:加入过滤器

$scope.countryFilter = function (value) {
  var passCountry;
  if (angular.isUndefined($scope.countryQuery) || $scope.countryQuery === '') {
    passCountry = true;
  }
  else {
    passCountry = value.name.indexOf($scope.countryQuery) >= 0 || value.alpha_2.indexOf($scope.countryQuery) >= 0;
  }

  var passRegion;
  if (angular.isUndefined($scope.region) || $scope.region === '') {
    passRegion = true;
  }
  else {
    passRegion = value.region === $scope.region;
  }

  return passCountry && passRegion;
};