ng-options:如何按 collection.item.itemName 排序
ng-options: How can I sort by collection.item.itemName
我有一个 select 遍历集合,如下所示:
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)排序,在我的情况下,这通常与国家名称,因此下拉列表中的国家名称不是按字母顺序排序的
如何使下拉列表按国家/地区名称的字母顺序排序?提前致谢!
首先,将您的数据集重写为更 'simple' / 'JSON' 的方法。由于 orderBy
没有(也不会)为 Objects
(link)
实现
$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>
在您的 select 标签中使用 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'}
]
您也可以直接在 Javascript 中对数组进行排序。
$scope.countriesList = [
{countryName: 'Denmark', preferredLanguage: 'DA'},
{countryName: 'Belgium', preferredLanguage: 'NL'},
{countryName: 'USA', preferredLanguage: 'EN'}
]
.sort(function(a, b){
return a.countryName < b.countryName;
});
您不能使用 orderBy
过滤器,因为您正在使用对象数据源,并且 orderBy
过滤器适用于数组数据源
如果您想使用 orderBy
过滤器,请按照其他答案中所述对您的数据源进行更改
如果您想使用对象,我建议您添加一个函数来 return 排序值。
在控制器中:
$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;
}
在HTMLselect
ng-options="country as country.countryName for country in getSortedCountryList()"
我有一个 select 遍历集合,如下所示:
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)排序,在我的情况下,这通常与国家名称,因此下拉列表中的国家名称不是按字母顺序排序的
如何使下拉列表按国家/地区名称的字母顺序排序?提前致谢!
首先,将您的数据集重写为更 'simple' / 'JSON' 的方法。由于 orderBy
没有(也不会)为 Objects
(link)
$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>
在您的 select 标签中使用 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'}
]
您也可以直接在 Javascript 中对数组进行排序。
$scope.countriesList = [
{countryName: 'Denmark', preferredLanguage: 'DA'},
{countryName: 'Belgium', preferredLanguage: 'NL'},
{countryName: 'USA', preferredLanguage: 'EN'}
]
.sort(function(a, b){
return a.countryName < b.countryName;
});
您不能使用 orderBy
过滤器,因为您正在使用对象数据源,并且 orderBy
过滤器适用于数组数据源
如果您想使用 orderBy
过滤器,请按照其他答案中所述对您的数据源进行更改
如果您想使用对象,我建议您添加一个函数来 return 排序值。
在控制器中:
$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;
}
在HTMLselect
ng-options="country as country.countryName for country in getSortedCountryList()"