我有一个HTML select元素,它提供了一些有关如何对列表进行排序的选项,它看起来像这样:
<select ng-init="sortMethod=sortMethods[0]" ng-model="sortMethod">
<option ng-repeat="sortMethod in sortMethods">{{sortMethod}}</option>
</select>
这是sortMethod:
$scope.sortMethods = ['created', 'likes.count'];
我正在使用sortMethod对一堆对象进行排序:
<li ng-repeat="story in feedData|orderBy:sortMethod">
Panel Count: {{story.frameURIs.length}}
</li>
所有这些工作都很好,但是问题在于选择框中的选项很难看,它显示“ created”和“ likes.count”,但应该显示“ Most Latest”和“ Most Popular”之类的字样。
我试图将sortMethod更改为这样的对象数组:
$scope.sortMethods = [{'displayVal': 'Most Recent', 'sortVal': 'created'}, {'displayVal': 'Most Popular', 'sortVal': 'likes.count'}];
并在
sortMethod.displayVal
元素中显示select
,并使用<li ng-repeat="story in feedData|orderBy:sortMethod.sortVal"
,但这似乎是按照看似随机的顺序对它们进行排序。如何在不更改feedData中的信息的情况下做出漂亮的选择选项? feedData来自另一方,我无法更改。 最佳答案
您正在朝正确的方向思考-即为sortMethods
创建适当的视图模型。
您应该看看如何使用ng-options
生成用于选择的选项。它允许您设置显示值以及所选对象是什么。
具体来说,对于您的情况,您可以选择整个sortMethod
对象(这将分配给ngModel
),但显示sortMethod.displayVal
的标签。然后,您可以在过滤本身中使用sortVal
。
因此,它看起来像这样:
<select ng-model="selectedSortMethod"
ng-options="sortMethod as sortMethod.displayVal for sortMethod in sortMethods">
</select>
<li ng-repeat="story in feedData|orderBy:selectedSortMethod.sortVal">
Panel Count: {{story.frameURIs.length}}
</li>
然后在控制器中:
// as you did in your example
$scope.sortMethods = [
{displayVal: 'Most Recent', sortVal: 'created'},
{displayVal: 'Most Popular', sortVal: 'likes.count'}
];
$scope.selectedSortMethod = $scope.sortMethods[0];
Plunker