【问题标题】:ng-options: How can I sort by collection.item.itemNameng-options:如何按 collection.item.itemName 排序
【发布时间】:2017-01-31 13:16:39
【问题描述】:

我有一个选择迭代一个看起来像这样的集合:

ctrl.countriesList = {
    'DK': {countryName: 'Denmark', preferredLanguage: 'DA'}
    'US': {countryName: 'USA', preferredLanguage: 'EN'}
}

和对对象的迭代:

ng-options="country as country.countryName for country in $ctrl.countriesList"

所以我的下拉列表现在可以在每个国家/地区的下拉列表中正确显示 countryName 属性,但它仍然按 ISO 代码值(DK、US)排序,在我的情况下这通常与国家名称不一致,所以排序下拉列表中的 countryNames 不是按字母顺序排列的

如何按 countryName 的字母顺序对下拉列表进行排序?提前致谢!

【问题讨论】:

标签: javascript angularjs sorting ng-options


【解决方案1】:

您不能使用 orderBy 过滤器,因为您使用的是对象数据源,而 orderBy 过滤器适用于数组数据源

See this question

如果您想使用 orderBy 过滤器,请按照其他答案中的说明对您的数据源进行更改

如果你想使用对象,我建议你添加一个返回排序值的函数。

在控制器中:

$scope.ctrl = {//---> Source
            countriesList : {
        'DK': {countryName: 'Denmark', preferredLanguage: 'DA'},
        'US': {countryName: 'USA', preferredLanguage: 'EN'},
        'BEL':{countryName: 'Belgium', preferredLanguage: 'NL'}
      }
}



 $scope.getSortedCountryList = function(){ //--> Sort Function
$scope.sorted = {};
Object.keys($scope.ctrl.countriesList)
        .sort(function(a,b){
          if($scope.ctrl.countriesList[a].countryName < $scope.ctrl.countriesList[b].countryName) return -1;
          if($scope.ctrl.countriesList[a].countryName > $scope.ctrl.countriesList[b].countryName) return 1;
          return 0;
         })
         .forEach(function(v, i) {
           $scope.sorted[v] = $scope.ctrl.countriesList[v];
         });
return $scope.sorted;
}

在 HTML 中 select

ng-options="country as country.countryName for country in getSortedCountryList()"

FIDDLE

【讨论】:

  • 好的,所以我想不可能像我一样对对象结构进行排序。我将看看是否可以使用您的建议对结构进行排序,或者将整个数据结构更改为数组。会将您的答案标记为已接受 - 谢谢!
  • 我最终使用了您的排序功能!非常感谢!
  • 找到了一种通过编写 .sort 来稍微改进排序的方法: .sort(function(a,b){ return countriesList[a].countryName.localeCompare(countriesList[b]. countryName); }) 只是想以良好的方式分享这个
  • 感谢分享:)
【解决方案2】:

首先将您的数据集重写为更“简单”/“JSON”之类的方法。由于orderBy不是(也不会)为Objectslink)实现

 $scope.countriesList = [
      {countryName: 'Denmark', preferredLanguage: 'DA'},
      {countryName: 'Belgium', preferredLanguage: 'NL'},
      {countryName: 'USA', preferredLanguage: 'EN'}
  ]

在视图级别:

<select ng-options="country.countryName for country in countriesList | orderBy:'countryName':false" ng-model="selected"></select>

SEE PLUNKR

【讨论】:

  • 如果我这样做,我将丢失 ISO 代码,例如丹麦的“DK” - 不幸的是,我需要这是关键
【解决方案3】:

您还可以直接在 Javascript 中对数组进行排序。

$scope.countriesList = [
      {countryName: 'Denmark', preferredLanguage: 'DA'},
      {countryName: 'Belgium', preferredLanguage: 'NL'},
      {countryName: 'USA', preferredLanguage: 'EN'}
  ]
.sort(function(a, b){
  return a.countryName < b.countryName;
});

【讨论】:

  • “OP”是什么意思?
  • OP 是原始海报,但不幸的是我不能使用数组 - 我需要一个带有 ISO 的对象作为国家 obj 值的键。不过谢谢你的建议!
【解决方案4】:

在您的选择标签中使用 orderBy 服务

<select  ng-options="country as country.countryName for country in ctrl.countriesList | orderBy:'countryName':false" ng-model="country">

同时更新 json

 $scope.ctrl.countriesList = [
  {countryName: 'Denmark', preferredLanguage: 'DA'},
  {countryName: 'USA', preferredLanguage: 'EN'}
  ]

Plunkr

【讨论】:

  • 这仅在更新数据模型时有效,不适用于对象。请正确阅读问题。
  • 用户没有提到
  • 他在他的问题中陈述了这个字面意思。他甚至在他最初的问题中显示了数据对象。你的答案不正确。
  • 我听不懂哥们你在说什么?
  • 您的回答不完整。如果用户根据您的回答更改了他的代码,它仍然对他不起作用,他的数据对象 (ctrl.countriesList) 是 object based model。您的答案暗示了键/值表示格式。
猜你喜欢
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-09
相关资源
最近更新 更多