我有一个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

10-06 15:31